SHOW:
|
|
- or go back to the newest paste.
| 1 | #include <a_samp> | |
| 2 | #pragma tabsize 0 | |
| 3 | ||
| 4 | - | #define VERSION "0.4" |
| 4 | + | #define VERSION "0.4b" |
| 5 | ||
| 6 | - | #define MAX_FLAMES 100 // maxmimal flames |
| 6 | + | #define MAX_FIRES 100 // max amout of fires able to exist at once |
| 7 | - | #define BurnOthers // Should other players burn, too, if they are touching a burning player? |
| 7 | + | #define BurnOthers // should players be able to ignite other players by touching? |
| 8 | - | //#define EarnMoney // Do you want to earn money for extinguish a fire? |
| 8 | + | #define FireMessageColor 0x00FF55FF // color used for the extinguishing message |
| 9 | - | #define FireMessageColor 0x00FF55FF // color used for the extinguish-message |
| 9 | + | |
| 10 | #define BURNING_RADIUS 1.2 // radius in which you start burning if you're too close to a fire | |
| 11 | - | //#define MessageToAll // Should the extinguish-message be sent to all players? |
| 11 | + | #define ONFOOT_RADIUS 1.5 // radius in which you can extinguish the fire by foot |
| 12 | #define PISSING_DISTANCE 2.0 // radius in which you can extinguish the fire by peeing | |
| 13 | - | #define FLAME_ZONE 1.2 // radius in which you start burning if you're too close to a flame |
| 13 | + | #define CAR_RADIUS 8.0 // radius in which you can extinguish the fire by firetruck/SWAT Van |
| 14 | - | #define ONFOOT_RADIUS 1.5 // radius in which you can extinguish the flames by foot |
| 14 | + | #define Z_DIFFERENCE 2.5 // height which is used for technical accurancy of extinguishing. Please do not change |
| 15 | - | #define PISSING_WAY 2.0 // radius in which you can extinguish the flames by peeing |
| 15 | + | #define FIRE_UPDATE_TIMER_DELAY 500 // amount of milliseconds the fire timer should loop in |
| 16 | - | #define CAR_RADIUS 8.0 // radius in which you can extinguish the flames by firetruck/SWAT Van |
| 16 | + | #define EXTINGUISH_TIME_VEHICLE 1 // time you have to spray at the fire with a firetruck (seconds) |
| 17 | - | #define Z_DIFFERENCE 2.5 // height which is important for the accurancy of extinguishing. please do not change |
| 17 | + | #define EXTINGUISH_TIME_ONFOOT 4 // time you have to spray at the fire onfoot (seconds) |
| 18 | - | #define EXTINGUISH_TIME_VEHICLE 1 // time you have to spray at the fire with a firetruck (seconds) |
| 18 | + | #define EXTINGUISH_TIME_PEEING 10 // time you have to pee at the fire (seconds) |
| 19 | - | #define EXTINGUISH_TIME_ONFOOT 4 // time you have to spray at the fire onfoot (seconds) |
| 19 | + | #define EXTINGUISH_TIME_PLAYER 2 // time it takes to extinguish a player (seconds) |
| 20 | - | #define EXTINGUISH_TIME_PEEING 10 // time you have to pee at the fire (seconds) |
| 20 | + | #define FIRE_OBJECT_SLOT 1 // the slot used with SetPlayerAttachedObject and RemovePlayerAttachedObject |
| 21 | - | #define EXTINGUISH_TIME_PLAYER 3 // time it takes to extinguish a player (seconds) |
| 21 | + | |
| 22 | - | #define FIRE_OBJECT_SLOT 1 // the slot used with SetPlayerAttachedObject and RemovePlayerAttachedObject |
| 22 | + | |
| 23 | //#define MessageToAll // Should the extinguishing message be sent to all players? | |
| 24 | ||
| 25 | - | #define SPECIAL_ACTION_PISSING 68 |
| 25 | + | |
| 26 | #define SPECIAL_ACTION_PISSING (68) | |
| 27 | #endif | |
| 28 | ||
| 29 | // Using a streamer? Maybe that would come handy ... | |
| 30 | - | forward AddFire(Float:x, Float:y, Float:z); |
| 30 | + | //#define DRAW_DISTANCE 200.0 |
| 31 | - | forward KillFire(id); |
| 31 | + | //#define CreateObject(%0) CreateDynamicObject(%0, -1, -1, -1, DRAW_DISTANCE) |
| 32 | - | forward AddSmoke(Float:x, Float:y, Float:z); |
| 32 | + | //#define DestroyObject(%0) DestroyDynamicObject(%0) |
| 33 | - | forward KillSmoke(id); |
| 33 | + | |
| 34 | - | forward DestroyTheSmokeFromFlame(id); |
| 34 | + | |
| 35 | ||
| 36 | - | forward FireTimer(playerid, id); |
| 36 | + | forward CreateFire(Float:x, Float:y, Float:z); |
| 37 | - | forward SetPlayerBurn(playerid); |
| 37 | + | forward CreateSmoke(Float:x, Float:y, Float:z); |
| 38 | forward DestroyFire(id); | |
| 39 | - | forward StopPlayerBurning(playerid); |
| 39 | + | forward DestroySmoke(id); |
| 40 | forward RemoveSmokeFromFire(id); | |
| 41 | forward TogglePlayerBurning(playerid, burning); | |
| 42 | ||
| 43 | forward OnFireUpdate(); | |
| 44 | forward ExtinguishTimer(playerid, id); | |
| 45 | forward BurningTimer(playerid); | |
| 46 | ||
| 47 | //===================== Variables ==================== | |
| 48 | ||
| 49 | enum FlameInfo | |
| 50 | {
| |
| 51 | - | new Flame[MAX_FLAMES][FlameInfo]; |
| 51 | + | |
| 52 | - | new ExtTimer[MAX_PLAYERS]; |
| 52 | + | |
| 53 | - | new PlayerOnFire[MAX_PLAYERS]; |
| 53 | + | |
| 54 | - | new PlayerOnFireTimer[MAX_PLAYERS]; |
| 54 | + | |
| 55 | - | new PlayerOnFireTimer2[MAX_PLAYERS]; |
| 55 | + | |
| 56 | ||
| 57 | new Flame[MAX_FIRES][FlameInfo]; | |
| 58 | new PlayerFireTimer[MAX_PLAYERS][3]; // Burn, StopBurn, Extinguish a fire | |
| 59 | new Float:PlayerOnFireHP[MAX_PLAYERS]; | |
| 60 | ||
| 61 | //===================== Normal Publics ==================== | |
| 62 | ||
| 63 | public OnGameModeInit() { OnFilterScriptInit(); }
| |
| 64 | public OnGameModeExit() { OnFilterScriptExit(); }
| |
| 65 | ||
| 66 | public OnFilterScriptInit() | |
| 67 | {
| |
| 68 | AntiDeAMX(); | |
| 69 | ||
| 70 | for(new i; i < MAX_PLAYERS; i++) | |
| 71 | {
| |
| 72 | PlayerFireTimer[i][2] = -1; | |
| 73 | } | |
| 74 | ||
| 75 | print(" ");
| |
| 76 | print(" /\\_/¯\\_/¯\\_/¯\\_/¯\\_/¯\\_/\\");
| |
| 77 | print(" < >");
| |
| 78 | #if defined German | |
| 79 | - | print(" > www.SpitNex.de <");
|
| 79 | + | |
| 80 | #else | |
| 81 | print(" > Extinguishable Fire "#VERSION" <");
| |
| 82 | - | SetTimer("OnFireUpdate", 500, 1);
|
| 82 | + | |
| 83 | #if defined German | |
| 84 | print(" < von Meta >");
| |
| 85 | - | ExtTimer[i] = -1; |
| 85 | + | |
| 86 | print(" < by Meta >");
| |
| 87 | #endif | |
| 88 | print(" \\/¯\\_/¯\\_/¯\\_/¯\\_/¯\\_/¯\\/\n");
| |
| 89 | SetTimer("OnFireUpdate", FIRE_UPDATE_TIMER_DELAY, 1);
| |
| 90 | return 1; | |
| 91 | } | |
| 92 | - | for(new i; i < MAX_FLAMES; i++) |
| 92 | + | |
| 93 | public OnFilterScriptExit() | |
| 94 | - | KillFire(i); |
| 94 | + | |
| 95 | for(new i; i < MAX_FIRES; i++) | |
| 96 | {
| |
| 97 | DestroyFire(i); | |
| 98 | - | if(PlayerOnFire[playerid] && !CanPlayerBurn(playerid, 1)) |
| 98 | + | |
| 99 | for(new playerid; playerid < MAX_PLAYERS; playerid++) | |
| 100 | - | StopPlayerBurning(playerid); |
| 100 | + | |
| 101 | if(GetPVarInt(playerid, "IsOnFire") && !CanPlayerBurn(playerid, 1)) | |
| 102 | {
| |
| 103 | TogglePlayerBurning(playerid, false); | |
| 104 | } | |
| 105 | } | |
| 106 | return 1; | |
| 107 | } | |
| 108 | ||
| 109 | public OnPlayerCommandText(playerid, cmdtext[]) | |
| 110 | {
| |
| 111 | new idx, cmd[256]; | |
| 112 | cmd = strtok(cmdtext, idx); | |
| 113 | if(IsPlayerAdmin(playerid)) | |
| 114 | {
| |
| 115 | #if defined German | |
| 116 | if(strcmp("/feuer", cmd, true) == 0)
| |
| 117 | #else | |
| 118 | if(strcmp("/fire", cmd, true) == 0)
| |
| 119 | #endif | |
| 120 | - | /*CallRemoteFuntion("*/AddFire(/*", "fff", */x, y, z);
|
| 120 | + | |
| 121 | new Float:x, Float:y, Float:z, Float:a; | |
| 122 | GetXYInFrontOfPlayer(playerid, x, y, z, a, 2.5); | |
| 123 | /*CallRemoteFuntion("*/CreateFire(/*", "fff", */x, y, z);
| |
| 124 | return 1; | |
| 125 | } | |
| 126 | } | |
| 127 | return 0; | |
| 128 | } | |
| 129 | - | if(PlayerOnFire[playerid]) |
| 129 | + | |
| 130 | public OnPlayerDeath(playerid, killerid, reason) | |
| 131 | {
| |
| 132 | - | SendClientMessage(playerid, 0xff000000, "Du bist verbrannt!"); StopPlayerBurning(playerid); |
| 132 | + | if(GetPVarInt(playerid, "IsOnFire")) |
| 133 | {
| |
| 134 | - | SendClientMessage(playerid, 0xff000000, "You died because of the fire!"); StopPlayerBurning(playerid); |
| 134 | + | |
| 135 | SendClientMessage(playerid, 0xff000000, "Du bist verbrannt!"); | |
| 136 | #else | |
| 137 | SendClientMessage(playerid, 0xff000000, "You got fried!"); | |
| 138 | #endif | |
| 139 | TogglePlayerBurning(playerid, false); | |
| 140 | } | |
| 141 | } | |
| 142 | ||
| 143 | public OnFireUpdate() | |
| 144 | {
| |
| 145 | new aim, piss; | |
| 146 | - | if(PlayerOnFire[playerid] && !CanPlayerBurn(playerid, 1)) |
| 146 | + | |
| 147 | {
| |
| 148 | - | StopPlayerBurning(playerid); |
| 148 | + | |
| 149 | if(!IsPlayerConnected(playerid) || IsPlayerNPC(playerid)) { continue; }
| |
| 150 | if(GetPVarInt(playerid, "IsOnFire") && !CanPlayerBurn(playerid, 1)) | |
| 151 | {
| |
| 152 | TogglePlayerBurning(playerid, false); | |
| 153 | } | |
| 154 | if(Pissing_at_Flame(playerid) != -1 || Aiming_at_Flame(playerid) != -1) | |
| 155 | {
| |
| 156 | piss = Pissing_at_Flame(playerid); aim = Aiming_at_Flame(playerid); | |
| 157 | - | GameTextForPlayer(playerid, " ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~r~~h~Flame ahead", 1500, 6); |
| 157 | + | |
| 158 | #if defined German | |
| 159 | - | if(ExtTimer[playerid] == -1 && ((aim != -1 && Pressing(playerid) & KEY_FIRE) || piss != -1)) |
| 159 | + | |
| 160 | #else | |
| 161 | GameTextForPlayer(playerid, " ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~n~ ~r~~h~Fire in sight", 1500, 6); | |
| 162 | #endif | |
| 163 | if(PlayerFireTimer[playerid][2] == -1 && ((aim != -1 && Pressing(playerid) & KEY_FIRE) || piss != -1)) | |
| 164 | {
| |
| 165 | new value, time, Float:x, Float:y, Float:z; | |
| 166 | if(piss != -1) | |
| 167 | {
| |
| 168 | value = piss; | |
| 169 | time = EXTINGUISH_TIME_PEEING; | |
| 170 | } | |
| 171 | else if(aim != -1) | |
| 172 | {
| |
| 173 | value = aim; | |
| 174 | if(GetPlayerWeapon(playerid) == 41) | |
| 175 | {
| |
| 176 | CreateExplosion(Flame[value][Flame_pos][0], Flame[value][Flame_pos][1], Flame[value][Flame_pos][2], 2, 5); | |
| 177 | continue; | |
| 178 | } | |
| 179 | if(IsPlayerInAnyVehicle(playerid)) | |
| 180 | {
| |
| 181 | time = EXTINGUISH_TIME_VEHICLE; | |
| 182 | } | |
| 183 | else | |
| 184 | {
| |
| 185 | time = EXTINGUISH_TIME_ONFOOT; | |
| 186 | } | |
| 187 | } | |
| 188 | if(value < -1) { time = EXTINGUISH_TIME_PLAYER; }
| |
| 189 | time *= 1000; | |
| 190 | if(value >= -1) | |
| 191 | - | DestroyTheSmokeFromFlame(value); |
| 191 | + | |
| 192 | x = Flame[value][Flame_pos][0]; | |
| 193 | y = Flame[value][Flame_pos][1]; | |
| 194 | z = Flame[value][Flame_pos][2]; | |
| 195 | RemoveSmokeFromFire(value); | |
| 196 | Flame[value][Smoke][0] = CreateObject(18727, x, y, z, 0.0, 0.0, 0.0); | |
| 197 | - | SetTimerEx("DestroyTheSmokeFromFlame", time, 0, "d", value);
|
| 197 | + | |
| 198 | Flame[value][Smoke][2] = CreateObject(18727, x-1, y, z, 0.0, 0.0, 0.0); | |
| 199 | - | ExtTimer[playerid] = SetTimerEx("FireTimer", time, 0, "dd", playerid, value);
|
| 199 | + | |
| 200 | Flame[value][Smoke][4] = CreateObject(18727, x, y-1, z, 0.0, 0.0, 0.0); | |
| 201 | } | |
| 202 | PlayerFireTimer[playerid][2] = SetTimerEx("ExtinguishTimer", time, 0, "dd", playerid, value);
| |
| 203 | } | |
| 204 | - | SetPlayerBurn(playerid); |
| 204 | + | |
| 205 | if(CanPlayerBurn(playerid) && IsAtFlame(playerid)) | |
| 206 | {
| |
| 207 | TogglePlayerBurning(playerid, true); | |
| 208 | } | |
| 209 | #if defined BurnOthers | |
| 210 | new Float:x, Float:y, Float:z; | |
| 211 | for(new i; i < MAX_PLAYERS; i++) | |
| 212 | - | if(CanPlayerBurn(i) && PlayerOnFire[playerid] && !PlayerOnFire[i]) |
| 212 | + | |
| 213 | if(playerid != i && IsPlayerConnected(i) && !IsPlayerNPC(i)) | |
| 214 | {
| |
| 215 | - | if(IsPlayerInRangeOfPoint(playerid, 1, x, y, z)) |
| 215 | + | if(CanPlayerBurn(i) && GetPVarInt(playerid, "IsOnFire") && !GetPVarInt(i, "IsOnFire")) |
| 216 | {
| |
| 217 | - | SetPlayerBurn(i); |
| 217 | + | |
| 218 | if(IsPlayerInRangeOfPoint(playerid, BURNING_RADIUS, x, y, z)) | |
| 219 | {
| |
| 220 | TogglePlayerBurning(i, true); | |
| 221 | } | |
| 222 | } | |
| 223 | } | |
| 224 | } | |
| 225 | #endif | |
| 226 | } | |
| 227 | return 1; | |
| 228 | } | |
| 229 | ||
| 230 | ||
| 231 | //===================== stocks ==================== | |
| 232 | ||
| 233 | stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, &Float:z, &Float:a, Float:distance) | |
| 234 | {
| |
| 235 | GetPlayerPos(playerid, x, y ,z); | |
| 236 | if(IsPlayerInAnyVehicle(playerid)) | |
| 237 | {
| |
| 238 | GetVehicleZAngle(GetPlayerVehicleID(playerid),a); | |
| 239 | } | |
| 240 | else | |
| 241 | {
| |
| 242 | GetPlayerFacingAngle(playerid, a); | |
| 243 | } | |
| 244 | x += (distance * floatsin(-a, degrees)); | |
| 245 | y += (distance * floatcos(-a, degrees)); | |
| 246 | return 0; | |
| 247 | } | |
| 248 | ||
| 249 | stock strtok(const string[], &index) | |
| 250 | {
| |
| 251 | new length = strlen(string); | |
| 252 | while ((index < length) && (string[index] <= ' ')) | |
| 253 | {
| |
| 254 | index++; | |
| 255 | } | |
| 256 | new offset = index; | |
| 257 | new result[256]; | |
| 258 | while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) | |
| 259 | {
| |
| 260 | result[index - offset] = string[index]; | |
| 261 | index++; | |
| 262 | } | |
| 263 | result[index - offset] = EOS; | |
| 264 | return result; | |
| 265 | } | |
| 266 | ||
| 267 | #if !defined ReturnUser | |
| 268 | stock ReturnUser(text[]) | |
| 269 | {
| |
| 270 | new pos = 0; | |
| 271 | while (text[pos] < 0x21) | |
| 272 | {
| |
| 273 | if(text[pos] == 0) return INVALID_PLAYER_ID; | |
| 274 | pos++; | |
| 275 | } | |
| 276 | new userid = INVALID_PLAYER_ID; | |
| 277 | if(isNumeric(text[pos])) | |
| 278 | {
| |
| 279 | userid = strval(text[pos]); | |
| 280 | if(userid >=0 && userid < MAX_PLAYERS) | |
| 281 | {
| |
| 282 | if(!IsPlayerConnected(userid)) | |
| 283 | userid = INVALID_PLAYER_ID; | |
| 284 | else return userid; | |
| 285 | } | |
| 286 | } | |
| 287 | new len = strlen(text[pos]); | |
| 288 | new count = 0; | |
| 289 | new pname[MAX_PLAYER_NAME]; | |
| 290 | for (new i = 0; i < MAX_PLAYERS; i++) | |
| 291 | {
| |
| 292 | if(IsPlayerConnected(i)) | |
| 293 | {
| |
| 294 | GetPlayerName(i, pname, sizeof (pname)); | |
| 295 | if(strcmp(pname, text[pos], true, len) == 0) | |
| 296 | {
| |
| 297 | if(len == strlen(pname)) return i; | |
| 298 | else | |
| 299 | {
| |
| 300 | count++; | |
| 301 | userid = i; | |
| 302 | } | |
| 303 | } | |
| 304 | } | |
| 305 | } | |
| 306 | if(count != 1) | |
| 307 | {
| |
| 308 | userid = INVALID_PLAYER_ID; | |
| 309 | } | |
| 310 | return userid; | |
| 311 | } | |
| 312 | #endif | |
| 313 | #if !defined isNumeric | |
| 314 | stock isNumeric(const string[]) | |
| 315 | {
| |
| 316 | new length=strlen(string); | |
| 317 | if (length==0) return false; | |
| 318 | for (new i = 0; i < length; i++) | |
| 319 | {
| |
| 320 | if ((string[i] > '9' || string[i] < '0' && string[i]!='-' && string[i]!='+') /*Not a number,'+' or '-'*/|| (string[i]=='-' && i!=0)/* A '-' but not at first.*/|| (string[i]=='+' && i!=0)/* A '+' but not at first.*/) | |
| 321 | {
| |
| 322 | return false; | |
| 323 | } | |
| 324 | } | |
| 325 | if (length==1 && (string[0]=='-' || string[0]=='+')) { return false; }
| |
| 326 | return true; | |
| 327 | } | |
| 328 | #endif | |
| 329 | ||
| 330 | stock Float:GetDistanceBetweenPoints(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2) //By Gabriel "Larcius" Cordes | |
| 331 | {
| |
| 332 | return floatadd(floatadd(floatsqroot(floatpower(floatsub(x1,x2),2)),floatsqroot(floatpower(floatsub(y1,y2),2))),floatsqroot(floatpower(floatsub(z1,z2),2))); | |
| 333 | } | |
| 334 | ||
| 335 | stock Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) | |
| 336 | {
| |
| 337 | new Float:TGTDistance; | |
| 338 | ||
| 339 | // get distance from camera to target | |
| 340 | TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ)); | |
| 341 | ||
| 342 | new Float:tmpX, Float:tmpY, Float:tmpZ; | |
| 343 | ||
| 344 | tmpX = FrX * TGTDistance + CamX; | |
| 345 | tmpY = FrY * TGTDistance + CamY; | |
| 346 | tmpZ = FrZ * TGTDistance + CamZ; | |
| 347 | ||
| 348 | return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ)); | |
| 349 | } | |
| 350 | ||
| 351 | stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius) | |
| 352 | {
| |
| 353 | new Float:cx,Float:cy,Float:cz,Float:fx,Float:fy,Float:fz; | |
| 354 | GetPlayerCameraPos(playerid, cx, cy, cz); | |
| 355 | GetPlayerCameraFrontVector(playerid, fx, fy, fz); | |
| 356 | return (radius >= DistanceCameraTargetToLocation(cx, cy, cz, x, y, z, fx, fy, fz)); | |
| 357 | } | |
| 358 | - | public AddFire(Float:x, Float:y, Float:z) |
| 358 | + | |
| 359 | //===================== Own Publics ==================== | |
| 360 | ||
| 361 | public CreateFire(Float:x, Float:y, Float:z) | |
| 362 | {
| |
| 363 | new slot = GetFlameSlot(); | |
| 364 | if(slot == -1) {return slot;}
| |
| 365 | Flame[slot][Flame_Exists] = 1; | |
| 366 | Flame[slot][Flame_pos][0] = x; | |
| 367 | Flame[slot][Flame_pos][1] = y; | |
| 368 | Flame[slot][Flame_pos][2] = z - Z_DIFFERENCE; | |
| 369 | Flame[slot][Flame_id] = CreateObject(18689, Flame[slot][Flame_pos][0], Flame[slot][Flame_pos][1], Flame[slot][Flame_pos][2], 0.0, 0.0, 0.0); | |
| 370 | - | public KillFire(id) |
| 370 | + | |
| 371 | for(new i; i < 5; i++) | |
| 372 | {
| |
| 373 | Flame[slot][Smoke][i] = -1; | |
| 374 | } | |
| 375 | return slot; | |
| 376 | } | |
| 377 | - | DestroyTheSmokeFromFlame(id); |
| 377 | + | |
| 378 | public DestroyFire(id) | |
| 379 | {
| |
| 380 | DestroyObject(Flame[id][Flame_id]); | |
| 381 | Flame[id][Flame_Exists] = 0; | |
| 382 | Flame[id][Flame_pos][0] = 0.0; | |
| 383 | Flame[id][Flame_pos][1] = 0.0; | |
| 384 | - | public AddSmoke(Float:x, Float:y, Float:z) |
| 384 | + | |
| 385 | RemoveSmokeFromFire(id); | |
| 386 | } | |
| 387 | ||
| 388 | //# A suggestion from a user of this script. Very simple functions to add and remove smoke without flames. | |
| 389 | - | public KillSmoke(id) |
| 389 | + | |
| 390 | //# Maybe you could link smoke on a house with variables to a flame inside a house so if the flame gets extinguished the smoke disappears. | |
| 391 | ||
| 392 | public CreateSmoke(Float:x, Float:y, Float:z) | |
| 393 | {
| |
| 394 | return CreateObject(18727, x, y, z, 0.0, 0.0, 0.0); | |
| 395 | - | public DestroyTheSmokeFromFlame(id) |
| 395 | + | |
| 396 | ||
| 397 | - | for(new i; i < 5; i++) { DestroyObject(Flame[id][Smoke][i]); }
|
| 397 | + | public DestroySmoke(id) |
| 398 | {
| |
| 399 | DestroyObject(id); | |
| 400 | - | public FireTimer(playerid, id) |
| 400 | + | |
| 401 | ||
| 402 | - | if(id < -1 && (Aiming_at_Flame(playerid) == id || Pissing_at_Flame(playerid) == id)) { StopPlayerBurning(id+MAX_PLAYERS); }
|
| 402 | + | |
| 403 | public RemoveSmokeFromFire(id) | |
| 404 | {
| |
| 405 | for(new i; i < 5; i++) | |
| 406 | {
| |
| 407 | DestroyObject(Flame[id][Smoke][i]); | |
| 408 | Flame[id][Smoke][i] = -1; | |
| 409 | } | |
| 410 | } | |
| 411 | ||
| 412 | public ExtinguishTimer(playerid, id) | |
| 413 | {
| |
| 414 | if(id < -1 && (Aiming_at_Flame(playerid) == id || Pissing_at_Flame(playerid) == id)) { TogglePlayerBurning(id+MAX_PLAYERS, false); }
| |
| 415 | else if(Flame[id][Flame_Exists] && ((Pressing(playerid) & KEY_FIRE && Aiming_at_Flame(playerid) == id) || (Pissing_at_Flame(playerid) == id))) | |
| 416 | {
| |
| 417 | new sendername[MAX_PLAYER_NAME+26]; | |
| 418 | GetPlayerName(playerid, sendername, sizeof(sendername)); | |
| 419 | #if defined MessageToAll | |
| 420 | if(Pissing_at_Flame(playerid) == id) | |
| 421 | {
| |
| 422 | #if defined German | |
| 423 | format(sendername, sizeof(sendername), "* %s hat einen Brand ausgepisst! *", sendername); | |
| 424 | #else | |
| 425 | format(sendername, sizeof(sendername), "* %s pissed out a fire! *", sendername); | |
| 426 | #endif | |
| 427 | } | |
| 428 | else if(Aiming_at_Flame(playerid) == id) | |
| 429 | {
| |
| 430 | #if defined German | |
| 431 | format(sendername, sizeof(sendername), "* %s hat einen Brand gelöscht! *", sendername); | |
| 432 | #else | |
| 433 | format(sendername, sizeof(sendername), "* %s extinguished a fire! *", sendername); | |
| 434 | #endif | |
| 435 | } | |
| 436 | SendClientMessageToAll(FireMessageColor, sendername); | |
| 437 | #else | |
| 438 | if(Pissing_at_Flame(playerid) == id) | |
| 439 | {
| |
| 440 | #if defined German | |
| 441 | SendClientMessage(playerid, FireMessageColor, "* Du hast einen Brand ausgepisst! *"); | |
| 442 | #else | |
| 443 | - | KillFire(id); |
| 443 | + | |
| 444 | - | #if defined EarnMoney |
| 444 | + | |
| 445 | - | GivePlayerMoney(playerid, 500); |
| 445 | + | |
| 446 | else if(Aiming_at_Flame(playerid) == id) | |
| 447 | {
| |
| 448 | - | KillTimer(ExtTimer[playerid]); |
| 448 | + | |
| 449 | - | ExtTimer[playerid] = -1; |
| 449 | + | |
| 450 | #else | |
| 451 | SendClientMessage(playerid, FireMessageColor, "* You extinguished a fire! *"); | |
| 452 | - | public SetPlayerBurn(playerid) |
| 452 | + | |
| 453 | } | |
| 454 | - | SetPlayerAttachedObject(playerid, FIRE_OBJECT_SLOT, 18690, 2, -1, 0, -1.9, 0, 0); |
| 454 | + | |
| 455 | - | PlayerOnFire[playerid] = 1; |
| 455 | + | DestroyFire(id); |
| 456 | - | GetPlayerHealth(playerid, PlayerOnFireHP[playerid]); |
| 456 | + | |
| 457 | - | KillTimer(PlayerOnFireTimer[playerid]); KillTimer(PlayerOnFireTimer2[playerid]); |
| 457 | + | KillTimer(PlayerFireTimer[playerid][2]); |
| 458 | - | PlayerOnFireTimer[playerid] = SetTimerEx("BurningTimer", 91, 1, "d", playerid);
|
| 458 | + | PlayerFireTimer[playerid][2] = -1; |
| 459 | - | PlayerOnFireTimer2[playerid] = SetTimerEx("StopPlayerBurning", 7000, 0, "d", playerid);
|
| 459 | + | |
| 460 | ||
| 461 | public TogglePlayerBurning(playerid, burning) | |
| 462 | {
| |
| 463 | if(burning) | |
| 464 | {
| |
| 465 | - | if(PlayerOnFire[playerid]) |
| 465 | + | SetPlayerAttachedObject(playerid, FIRE_OBJECT_SLOT, 18690, 2, -1, 0, -1.9, 0, 0); |
| 466 | GetPlayerHealth(playerid, PlayerOnFireHP[playerid]); | |
| 467 | KillTimer(PlayerFireTimer[playerid][0]); KillTimer(PlayerFireTimer[playerid][1]); | |
| 468 | PlayerFireTimer[playerid][0] = SetTimerEx("BurningTimer", 91, 1, "d", playerid);
| |
| 469 | PlayerFireTimer[playerid][1] = SetTimerEx("TogglePlayerBurning", 7000, 0, "dd", playerid, 0);
| |
| 470 | } | |
| 471 | else | |
| 472 | {
| |
| 473 | - | CallRemoteFunction("SetPlayerHealth", "dd", playerid, PlayerOnFireHP[playerid]-1.0);
|
| 473 | + | KillTimer(PlayerFireTimer[playerid][0]); |
| 474 | RemovePlayerAttachedObject(playerid, FIRE_OBJECT_SLOT); | |
| 475 | } | |
| 476 | - | else { KillTimer(PlayerOnFireTimer[playerid]); KillTimer(PlayerOnFireTimer2[playerid]); }
|
| 476 | + | SetPVarInt(playerid, "IsOnFire", burning); |
| 477 | return 1; | |
| 478 | } | |
| 479 | - | public StopPlayerBurning(playerid) |
| 479 | + | |
| 480 | public BurningTimer(playerid) | |
| 481 | - | KillTimer(PlayerOnFireTimer[playerid]); |
| 481 | + | |
| 482 | - | PlayerOnFire[playerid] = 0; |
| 482 | + | if(GetPVarInt(playerid, "IsOnFire")) |
| 483 | - | RemovePlayerAttachedObject(playerid, FIRE_OBJECT_SLOT); |
| 483 | + | |
| 484 | new Float:hp; | |
| 485 | GetPlayerHealth(playerid, hp); | |
| 486 | if(hp < PlayerOnFireHP[playerid]) | |
| 487 | {
| |
| 488 | PlayerOnFireHP[playerid] = hp; | |
| 489 | } | |
| 490 | PlayerOnFireHP[playerid] -= 1.0; | |
| 491 | SetPlayerHealth(playerid, PlayerOnFireHP[playerid]); | |
| 492 | - | for(new i; i < MAX_FLAMES; i++) |
| 492 | + | |
| 493 | else { KillTimer(PlayerFireTimer[playerid][0]); KillTimer(PlayerFireTimer[playerid][1]); }
| |
| 494 | } | |
| 495 | ||
| 496 | //===================== Other Functions ==================== | |
| 497 | ||
| 498 | stock GetFireID(Float:x, Float:y, Float:z, &Float:dist) | |
| 499 | {
| |
| 500 | new id = -1; | |
| 501 | dist = 99999.99; | |
| 502 | for(new i; i < MAX_FIRES; i++) | |
| 503 | {
| |
| 504 | if(GetDistanceBetweenPoints(x,y,z,Flame[i][Flame_pos][0],Flame[i][Flame_pos][1],Flame[i][Flame_pos][2]) < dist) | |
| 505 | - | if(CallRemoteFunction("CanBurn", "d", playerid) >= 0 && !IsPlayerInWater(playerid) && GetPlayerSkin(playerid) != 277 && GetPlayerSkin(playerid) != 278 && GetPlayerSkin(playerid) != 279 && ((!val && !PlayerOnFire[playerid]) || (val && PlayerOnFire[playerid]))) { return 1; }
|
| 505 | + | |
| 506 | dist = GetDistanceBetweenPoints(x,y,z,Flame[i][Flame_pos][0],Flame[i][Flame_pos][1],Flame[i][Flame_pos][2]); | |
| 507 | id = i; | |
| 508 | } | |
| 509 | } | |
| 510 | return id; | |
| 511 | } | |
| 512 | ||
| 513 | stock CanPlayerBurn(playerid, val = 0) | |
| 514 | {
| |
| 515 | if(CallRemoteFunction("CanBurn", "d", playerid) >= 0 && !IsPlayerInWater(playerid) && GetPlayerSkin(playerid) != 277 && GetPlayerSkin(playerid) != 278 && GetPlayerSkin(playerid) != 279 && ((!val && !GetPVarInt(playerid, "IsOnFire")) || (val && GetPVarInt(playerid, "IsOnFire")))) { return 1; }
| |
| 516 | return 0; | |
| 517 | } | |
| 518 | ||
| 519 | /* //Uncomment or copy to your script. | |
| 520 | ||
| 521 | forward CanBurn(playerid); | |
| 522 | public CanBurn(playerid) | |
| 523 | {
| |
| 524 | if(...) | |
| 525 | {
| |
| 526 | return 1; | |
| 527 | } | |
| 528 | return -1; // IMPORTANT! | |
| 529 | } | |
| 530 | ||
| 531 | */ | |
| 532 | ||
| 533 | stock IsPlayerInWater(playerid) | |
| 534 | {
| |
| 535 | new Float:X, Float:Y, Float:Z, an = GetPlayerAnimationIndex(playerid); | |
| 536 | GetPlayerPos(playerid, X, Y, Z); | |
| 537 | if((1544 >= an >= 1538 || an == 1062 || an == 1250) && (Z <= 0 || (Z <= 41.0 && IsPlayerInArea(playerid, -1387, -473, 2025, 2824))) || | |
| 538 | (1544 >= an >= 1538 || an == 1062 || an == 1250) && (Z <= 2 || (Z <= 39.0 && IsPlayerInArea(playerid, -1387, -473, 2025, 2824)))) | |
| 539 | {
| |
| 540 | return 1; | |
| 541 | } | |
| 542 | return 0; | |
| 543 | } | |
| 544 | ||
| 545 | stock IsPlayerInArea(playerid, Float:MinX, Float:MaxX, Float:MinY, Float:MaxY) | |
| 546 | - | for(new i = 0; i < MAX_FLAMES; i++) |
| 546 | + | |
| 547 | new Float:x, Float:y, Float:z; | |
| 548 | GetPlayerPos(playerid, x, y, z); | |
| 549 | #pragma unused z | |
| 550 | if(x >= MinX && x <= MaxX && y >= MinY && y <= MaxY) { return 1; }
| |
| 551 | return 0; | |
| 552 | } | |
| 553 | ||
| 554 | stock GetFlameSlot() | |
| 555 | {
| |
| 556 | for(new i = 0; i < MAX_FIRES; i++) | |
| 557 | - | for(new i; i < MAX_FLAMES; i++) |
| 557 | + | |
| 558 | if(!Flame[i][Flame_Exists]) { return i; }
| |
| 559 | - | |
| 559 | + | |
| 560 | return -1; | |
| 561 | } | |
| 562 | - | if(!IsPlayerInAnyVehicle(playerid) && (IsPlayerInRangeOfPoint(playerid, FLAME_ZONE, Flame[i][Flame_pos][0], Flame[i][Flame_pos][1], Flame[i][Flame_pos][2]+Z_DIFFERENCE) || |
| 562 | + | |
| 563 | - | IsPlayerInRangeOfPoint(playerid, FLAME_ZONE, Flame[i][Flame_pos][0], Flame[i][Flame_pos][1], Flame[i][Flame_pos][2]+Z_DIFFERENCE-1))) |
| 563 | + | |
| 564 | ||
| 565 | stock IsAtFlame(playerid) | |
| 566 | {
| |
| 567 | for(new i; i < MAX_FIRES; i++) | |
| 568 | {
| |
| 569 | if(Flame[i][Flame_Exists]) | |
| 570 | {
| |
| 571 | if(!IsPlayerInAnyVehicle(playerid) && (IsPlayerInRangeOfPoint(playerid, BURNING_RADIUS, Flame[i][Flame_pos][0], Flame[i][Flame_pos][1], Flame[i][Flame_pos][2]+Z_DIFFERENCE) || | |
| 572 | IsPlayerInRangeOfPoint(playerid, BURNING_RADIUS, Flame[i][Flame_pos][0], Flame[i][Flame_pos][1], Flame[i][Flame_pos][2]+Z_DIFFERENCE-1))) | |
| 573 | {
| |
| 574 | return 1; | |
| 575 | } | |
| 576 | } | |
| 577 | } | |
| 578 | return 0; | |
| 579 | } | |
| 580 | ||
| 581 | new AaF_cache[MAX_PLAYERS] = { -1, ... };
| |
| 582 | new AaF_cacheTime[MAX_PLAYERS]; | |
| 583 | ||
| 584 | stock Aiming_at_Flame(playerid) | |
| 585 | {
| |
| 586 | if(gettime() - AaF_cacheTime[playerid] < 1) | |
| 587 | {
| |
| 588 | return AaF_cache[playerid]; | |
| 589 | } | |
| 590 | AaF_cacheTime[playerid] = gettime(); | |
| 591 | ||
| 592 | new id = -1; | |
| 593 | new Float:dis = 99999.99; | |
| 594 | new Float:dis2; | |
| 595 | new Float:px, Float:py, Float:pz; | |
| 596 | new Float:x, Float:y, Float:z, Float:a; | |
| 597 | - | if(IsPlayerConnected(i) && PlayerOnFire[i] && (IsInWaterCar(playerid) || HasExtinguisher(playerid) || GetPlayerWeapon(playerid) == 41 || Peeing(playerid)) && PlayerOnFire[i]) |
| 597 | + | |
| 598 | z -= Z_DIFFERENCE; | |
| 599 | ||
| 600 | new Float:cx,Float:cy,Float:cz,Float:fx,Float:fy,Float:fz; | |
| 601 | GetPlayerCameraPos(playerid, cx, cy, cz); | |
| 602 | GetPlayerCameraFrontVector(playerid, fx, fy, fz); | |
| 603 | ||
| 604 | for(new i; i < MAX_PLAYERS; i++) | |
| 605 | {
| |
| 606 | if(IsPlayerConnected(i) && GetPVarInt(i, "IsOnFire") && (IsInWaterCar(playerid) || HasExtinguisher(playerid) || GetPlayerWeapon(playerid) == 41 || Peeing(playerid)) && GetPVarInt(i, "IsOnFire")) | |
| 607 | {
| |
| 608 | GetPlayerPos(i, px, py, pz); | |
| 609 | if(!Peeing(playerid)) | |
| 610 | {
| |
| 611 | dis2 = DistanceCameraTargetToLocation(cx, cy, cz, px, py, pz, fx, fy, fz); | |
| 612 | } | |
| 613 | else | |
| 614 | {
| |
| 615 | if(IsPlayerInRangeOfPoint(playerid, ONFOOT_RADIUS, px, py, pz)) | |
| 616 | {
| |
| 617 | dis2 = 0.0; | |
| 618 | } | |
| 619 | } | |
| 620 | if(dis2 < dis) | |
| 621 | {
| |
| 622 | dis = dis2; | |
| 623 | - | for(new i; i < MAX_FLAMES; i++) |
| 623 | + | |
| 624 | if(Peeing(playerid)) | |
| 625 | {
| |
| 626 | return id; | |
| 627 | } | |
| 628 | } | |
| 629 | } | |
| 630 | } | |
| 631 | if(id != -1) { return id-MAX_PLAYERS; }
| |
| 632 | for(new i; i < MAX_FIRES; i++) | |
| 633 | {
| |
| 634 | if(Flame[i][Flame_Exists]) | |
| 635 | {
| |
| 636 | if(IsInWaterCar(playerid) || HasExtinguisher(playerid) || GetPlayerWeapon(playerid) == 41 || Peeing(playerid)) | |
| 637 | - | if((IsPlayerInAnyVehicle(playerid) && dis2 < CAR_RADIUS && dis2 < dis) || (!IsPlayerInAnyVehicle(playerid) && ((dis2 < ONFOOT_RADIUS && dis2 < dis) || (Peeing(playerid) && dis2 < PISSING_WAY && dis2 < dis)))) |
| 637 | + | |
| 638 | if(!Peeing(playerid)) | |
| 639 | {
| |
| 640 | dis2 = DistanceCameraTargetToLocation(cx, cy, cz, Flame[i][Flame_pos][0], Flame[i][Flame_pos][1], Flame[i][Flame_pos][2]+Z_DIFFERENCE, fx, fy, fz); | |
| 641 | } | |
| 642 | else | |
| 643 | {
| |
| 644 | dis2 = GetDistanceBetweenPoints(x,y,z,Flame[i][Flame_pos][0],Flame[i][Flame_pos][1],Flame[i][Flame_pos][2]); | |
| 645 | } | |
| 646 | if((IsPlayerInAnyVehicle(playerid) && dis2 < CAR_RADIUS && dis2 < dis) || (!IsPlayerInAnyVehicle(playerid) && ((dis2 < ONFOOT_RADIUS && dis2 < dis) || (Peeing(playerid) && dis2 < PISSING_DISTANCE && dis2 < dis)))) | |
| 647 | {
| |
| 648 | dis = dis2; | |
| 649 | id = i; | |
| 650 | } | |
| 651 | } | |
| 652 | } | |
| 653 | } | |
| 654 | if(id != -1) | |
| 655 | {
| |
| 656 | if | |
| 657 | ( | |
| 658 | ( | |
| 659 | IsPlayerInAnyVehicle(playerid) && !IsPlayerInRangeOfPoint(playerid, 50, Flame[id][Flame_pos][0], Flame[id][Flame_pos][1], Flame[id][Flame_pos][2]) | |
| 660 | ) | |
| 661 | || | |
| 662 | ( | |
| 663 | !IsPlayerInAnyVehicle(playerid) && !IsPlayerInRangeOfPoint(playerid, 5, Flame[id][Flame_pos][0], Flame[id][Flame_pos][1], Flame[id][Flame_pos][2]) | |
| 664 | ) | |
| 665 | ) | |
| 666 | { id = -1; }
| |
| 667 | - | new string[22]; |
| 667 | + | |
| 668 | - | format(string, sizeof(string), "%d", Aiming_at_Flame(playerid)); |
| 668 | + | |
| 669 | - | SendClientMessage(playerid, 0xFFFFFFFF, string); |
| 669 | + | |
| 670 | - | return strval(string); |
| 670 | + | |
| 671 | ||
| 672 | stock Pissing_at_Flame(playerid) | |
| 673 | {
| |
| 674 | if(Peeing(playerid)) | |
| 675 | {
| |
| 676 | return Aiming_at_Flame(playerid); | |
| 677 | } | |
| 678 | return -1; | |
| 679 | } | |
| 680 | ||
| 681 | stock IsInWaterCar(playerid) | |
| 682 | {
| |
| 683 | if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 407 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 601) { return 1; }
| |
| 684 | return 0; | |
| 685 | } | |
| 686 | ||
| 687 | stock HasExtinguisher(playerid) | |
| 688 | {
| |
| 689 | if(GetPlayerWeapon(playerid) == 42 && !IsPlayerInAnyVehicle(playerid)) { return 1; }
| |
| 690 | return 0; | |
| 691 | } | |
| 692 | ||
| 693 | stock Peeing(playerid) | |
| 694 | {
| |
| 695 | return GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_PISSING; | |
| 696 | } | |
| 697 | ||
| 698 | stock Pressing(playerid) | |
| 699 | {
| |
| 700 | new keys, updown, leftright; | |
| 701 | GetPlayerKeys(playerid, keys, updown, leftright); | |
| 702 | return keys; | |
| 703 | } | |
| 704 | ||
| 705 | //===================== Important Shit ==================== | |
| 706 | ||
| 707 | forward MMF_ExtFire(version[15]); | |
| 708 | public MMF_ExtFire(version[15]) | |
| 709 | {
| |
| 710 | if(strcmp(VERSION, version, true) && strlen(version)) | |
| 711 | {
| |
| 712 | return 2; | |
| 713 | } | |
| 714 | return 1; | |
| 715 | } | |
| 716 | ||
| 717 | AntiDeAMX() | |
| 718 | {
| |
| 719 | new foo[][] = | |
| 720 | {
| |
| 721 | "l33t", | |
| 722 | "lol xD" | |
| 723 | }; | |
| 724 | #pragma unused foo | |
| 725 | } |