SHOW:
|
|
- or go back to the newest paste.
1 | /* | |
2 | ||
3 | Bambi Ally! | |
4 | By Alternative112 | |
5 | ||
6 | Do NOT recirculate without first asking me! | |
7 | */ | |
8 | ||
9 | #include <a_samp> | |
10 | ||
11 | #define Holding(%0) \ | |
12 | ((newkeys & (%0)) == (%0)) | |
13 | ||
14 | new bambi; | |
15 | new bambiOwner = -1; | |
16 | new respawnTimer; | |
17 | new bool:canBambiAttack = true; //He only charges once every 5 seconds | |
18 | new bool:attacking = false; //If bambi is charging, don't make him follow the player | |
19 | new bool:canAttackPeople = true; //Can Bambi charge at players when the person who has him shoots them? | |
20 | new mapIcon = 69; //It must be unique, no other icons in your scripts must use it! | |
21 | ||
22 | //Where Bambi spawns - change it to wherever you like. | |
23 | //By default he spawns under the bridge that connects Red County and LV. | |
24 | new Float:spawnX = 1777.2007; | |
25 | new Float:spawnY = 595.1467; | |
26 | new Float:spawnZ = 10.5952; | |
27 | ||
28 | main() { | |
29 | print("||=-------------------------------=||"); | |
30 | print("||= BAMBI TIME!!!! ||"); | |
31 | print("||=-------------------------------=||"); | |
32 | } | |
33 | ||
34 | forward rechargeBambi(); | |
35 | public rechargeBambi() { | |
36 | attacking = false; | |
37 | canBambiAttack = true; | |
38 | return 1; | |
39 | } | |
40 | ||
41 | forward respawnBambi(); | |
42 | public respawnBambi() { | |
43 | DestroyObject(bambi); | |
44 | bambi = CreateObject(19315, spawnX, spawnY, spawnZ, 0.0, 0.0, 0.0); | |
45 | return 1; | |
46 | } | |
47 | ||
48 | stock detachBambi() { | |
49 | new Float:x, Float:y, Float:z; | |
50 | GetObjectPos(bambi, x, y, z); | |
51 | DestroyObject(bambi); | |
52 | bambi = CreateObject(19315, x, y, z, 0.0, 0.0, 0.0); | |
53 | return 1; | |
54 | } | |
55 | ||
56 | public OnFilterScriptInit() { | |
57 | bambi = CreateObject(19315, spawnX, spawnY, spawnZ, 0.0, 0.0, 0.0); | |
58 | return 1; | |
59 | } | |
60 | ||
61 | public OnFilterScriptExit() { | |
62 | DestroyObject(bambi); | |
63 | ||
64 | for (new i = 0; i < GetMaxPlayers(); i++) { | |
65 | if (IsPlayerConnected(i)) { | |
66 | RemovePlayerMapIcon(i, mapIcon); | |
67 | } | |
68 | } | |
69 | ||
70 | return 1; | |
71 | } | |
72 | ||
73 | public OnPlayerSpawn(playerid) { | |
74 | SetPlayerMapIcon(playerid, mapIcon, spawnX, spawnY, spawnZ, 21, 0, MAPICON_LOCAL); | |
75 | if (playerid == bambiOwner) { | |
76 | respawnTimer = SetTimer("respawnBambi", 30000, false); | |
77 | bambiOwner = -1; | |
78 | detachBambi(); | |
79 | } | |
80 | return 1; | |
81 | } | |
82 | ||
83 | - | public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid) { |
83 | + | public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) { |
84 | if (canAttackPeople) { | |
85 | - | if (playerid == bambiOwner && canBambiAttack && GetPlayerTeam(playerid) != GetPlayerTeam(damagedid)) { |
85 | + | if (issuerid == bambiOwner && canBambiAttack && GetPlayerTeam(issuerid) != GetPlayerTeam(playerid)) { |
86 | attacking = true; | |
87 | new Float:x, Float:y, Float:z, Float:bX, Float:bY, Float:bZ; | |
88 | ||
89 | - | GetPlayerPos(damagedid, x, y, z); |
89 | + | GetPlayerPos(playerid, x, y, z); |
90 | GetObjectPos(bambi, bX, bY, bZ); | |
91 | ||
92 | MoveObject(bambi, (x + (x - bX)), (y + (y - bY)), z, 30.0); | |
93 | ||
94 | - | if (GetPlayerState(damagedid) == PLAYER_STATE_ONFOOT) { |
94 | + | if (GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) { |
95 | - | ApplyAnimation(damagedid, "PED", "KO_SKID_FRONT", 4.1, 0, 1, 1, 0, 3000, 1); |
95 | + | ApplyAnimation(playerid, "PED", "KO_SKID_FRONT", 4.1, 0, 1, 1, 0, 3000, 1); |
96 | } | |
97 | ||
98 | canBambiAttack = false; | |
99 | SetTimer("rechargeBambi", 5000, false); | |
100 | } | |
101 | } | |
102 | return 1; | |
103 | } | |
104 | ||
105 | public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { | |
106 | if (Holding(KEY_CROUCH)) { | |
107 | new Float:x, Float:y, Float:z; | |
108 | GetObjectPos(bambi, x, y, z); | |
109 | ||
110 | if (IsPlayerInRangeOfPoint(playerid, 5.0, x, y, z) && IsValidObject(bambi)) { | |
111 | if (bambiOwner == -1) { | |
112 | SendClientMessage(playerid, 0xFFFF00FF, "You have recruited Bambi. Press the submission key to set him free!"); | |
113 | bambiOwner = playerid; | |
114 | KillTimer(respawnTimer); | |
115 | } | |
116 | } | |
117 | } | |
118 | ||
119 | if (Holding(KEY_SUBMISSION)) { | |
120 | if (playerid == bambiOwner) { | |
121 | respawnTimer = SetTimer("respawnBambi", 30000, false); | |
122 | bambiOwner = -1; | |
123 | ||
124 | if (IsPlayerInAnyVehicle(playerid)) { | |
125 | new Float:x, Float:y, Float:z; | |
126 | GetPlayerPos(playerid, x, y, z); | |
127 | SetObjectPos(bambi, (x - 5.0), (y - 5.0), (z - 1.0)); | |
128 | } | |
129 | else { | |
130 | detachBambi(); | |
131 | } | |
132 | ||
133 | SendClientMessage(playerid, 0xFFFF00FF, "You have released Bambi into the wild."); | |
134 | } | |
135 | } | |
136 | return 1; | |
137 | } | |
138 | ||
139 | public OnPlayerStateChange(playerid, newstate, oldstate) { | |
140 | - | if (oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT) { |
140 | + | if ((oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) && newstate == PLAYER_STATE_ONFOOT) { |
141 | if (playerid == bambiOwner) { | |
142 | new Float:x, Float:y, Float:z; | |
143 | GetPlayerPos(playerid, x, y, z); | |
144 | ||
145 | DestroyObject(bambi); | |
146 | bambi = CreateObject(19315, (x - 2.0), (y - 2.0), z, 0.0, 0.0, 0.0); | |
147 | } | |
148 | } | |
149 | - | else if (oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER) { |
149 | + | else if (oldstate == PLAYER_STATE_ONFOOT && (newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)) { |
150 | if (playerid == bambiOwner) { | |
151 | new Float:X, Float:Y, Float:Z; | |
152 | GetVehicleModelInfo(GetVehicleModel(playerid), VEHICLE_MODEL_INFO_SIZE, X, Y, Z); | |
153 | AttachObjectToVehicle(bambi, GetPlayerVehicleID(playerid), 0.0, 0.0, (Z * 0.80), 0.0, 0.0, 90.0); | |
154 | } | |
155 | } | |
156 | return 1; | |
157 | } | |
158 | ||
159 | public OnPlayerConnect(playerid) { | |
160 | return 1; | |
161 | } | |
162 | ||
163 | public OnPlayerDisconnect(playerid, reason) { | |
164 | detachBambi(); | |
165 | respawnTimer = SetTimer("respawnBambi", 30000, false); | |
166 | return 1; | |
167 | } | |
168 | ||
169 | public OnPlayerDeath(playerid, killerid, reason) { | |
170 | if (playerid == bambiOwner) { | |
171 | detachBambi(); | |
172 | respawnTimer = SetTimer("respawnBambi", 30000, false); | |
173 | } | |
174 | return 1; | |
175 | } | |
176 | ||
177 | public OnPlayerUpdate(playerid) { | |
178 | if (playerid == bambiOwner) { | |
179 | if (!IsPlayerInAnyVehicle(playerid)) { | |
180 | new Float:x, Float:y, Float:z, Float:bX, Float:bY, Float:bZ; | |
181 | GetPlayerPos(playerid, x, y, z); | |
182 | GetObjectPos(bambi, bX, bY, bZ); | |
183 | ||
184 | //If the player somehow teleported, teleport bambi, too! | |
185 | ||
186 | /*if (floatsub(bX, x) < 20.0 || floatadd(bX, x) > 20.0) { | |
187 | DestroyObject(bambi); | |
188 | bambi = CreateObject(19315, (x - 2.0), (y - 2.0), (z - 0.5), 0.0, 0.0, 0.0, GetPlayerInterior(playerid), GetPlayerVirtualWorld(playerid)); | |
189 | return 1; | |
190 | } | |
191 | ||
192 | if (floatsub(bY, y) < 20.0 || floatadd(bY, y) > 20.0) { | |
193 | DestroyObject(bambi); | |
194 | bambi = CreateObject(19315, (x - 2.0), (y - 2.0), (z - 0.5), 0.0, 0.0, 0.0, GetPlayerInterior(playerid), GetPlayerVirtualWorld(playerid)); | |
195 | return 1; | |
196 | } | |
197 | ||
198 | if (floatsub(bZ, z) < 20.0 || floatadd(bZ, z) > 20.0) { | |
199 | DestroyObject(bambi); | |
200 | bambi = CreateObject(19315, (x - 2.0), (y - 2.0), (z - 0.5), 0.0, 0.0, 0.0, GetPlayerInterior(playerid), GetPlayerVirtualWorld(playerid)); | |
201 | return 1; | |
202 | }*/ | |
203 | ||
204 | if (!attacking) { | |
205 | MoveObject(bambi, (x - 2.0), (y - 2.0), (z - 0.5), 8.0); | |
206 | } | |
207 | } | |
208 | } | |
209 | return 1; | |
210 | } |