#include #define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 // Don't delete the line above, it allows use of DCMD #define FILTERSCRIPT #if defined FILTERSCRIPT new SeaSuit[MAX_PLAYERS], SuitStatus[MAX_PLAYERS]; //SeaSuit stores object ID, SharkStatus stores the type of suit new Float:sharkx, Float:sharky, Float:sharkz, Float:sharka; //Used in /lsuit to take player position /* new Float:sxoffset, Float:syoffset, Float:szoffset; //Shark offsets new Float:dxoffset, Float:dyoffset, Float:dzoffset; // Dolphin Offsets new Float:txoffset, Float:tyoffset, Float:tzoffset; //Turtle offsets */ public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Sea Suits by Thomas_Conroy"); print("--------------------------------------\n"); SendClientMessageToAll(0xFF00FFAA, "SeaSuits Activated! Type /suithelp for commands! (by: Thomas_Conroy)"); return 1; } public OnFilterScriptExit() { SendClientMessageToAll(0xFF00FFAA, "SeaSuits Deactivated! (by: Thomas_Conroy)"); //Farewell message for(new i=0; i<=MAX_PLAYERS; i++) //Loops Playerid's { if(IsValidObject(SeaSuit[i])==1) GameTextForAll("Yoink!", 5000, 3), DestroyObject(SeaSuit[i]); //If player is wearing suit, delete it! SeaSuit[i] = 0; //Reset all values to 0 SuitStatus[i] = 0; } return 1; } #else #endif public OnPlayerRequestSpawn(playerid) { return 1; } public OnPlayerConnect(playerid) { SuitStatus[playerid] = 0; //Ensures the player does not have an erroneous SharkStatus setting return 1; } public OnPlayerDisconnect(playerid, reason) { DestroyObject(SeaSuit[playerid]); //Despawns and resets the players sharkstatus upon disconnection SuitStatus[playerid] = 0; return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/dsuit", cmdtext, true, 6) == 0) // This command deletes the currently spawned suit { if (SuitStatus[playerid] == 0) // Checks to see if the player has a suit { GameTextForPlayer(playerid, "~p~You need to be wearing a suit to delete it!",3000,3); } else // if the player DOES have a suit it is deleted and its status reset. { DestroyObject(SeaSuit[playerid]); GameTextForPlayer(playerid, "~r~All Gone!",3000,3); SuitStatus[playerid] = 0; } return 1; } if (strcmp("/lsuit", cmdtext, true, 6) == 0) //This command drops the suit (roughly) where the player is standing { if (SuitStatus[playerid] == 0) // Checks to see if the player has a suit { GameTextForPlayer(playerid, "~p~You need to be wearing a suit to take it off!",3000,3); } else //if the player DOES have a suit the players position is taken and the suit placed in relation to it. { GetPlayerPos(playerid, sharkx, sharky, sharkz); //Player pos and facing angle saved GetPlayerFacingAngle(playerid, sharka); DestroyObject(SeaSuit[playerid]); //I found it easier to delete and respawn the object as there is no DetachObjectFromPlayer command. switch(SuitStatus[playerid]) { case 1608: // Acts as if suitnumber = 1608 (Shark) { SeaSuit[playerid] = CreateObject(SuitStatus[playerid], sharkx, sharky - 2, sharkz, 0.0, 0.0, sharka); } case 1607: // Acts as if suitnumber = 1607 (Dolphin) { SeaSuit[playerid] = CreateObject(SuitStatus[playerid], sharkx, sharky - 0.2, sharkz + 0.2, 0.0, 0.0, sharka); } case 1609: // Acts as if suitnumber = 1609 (Turtle) { SeaSuit[playerid] = CreateObject(SuitStatus[playerid], sharkx - 0.1, sharky, sharkz + 0.27, 0.0, 0.0, sharka); } } GameTextForPlayer(playerid, "~r~Dumped!",3000,3); SuitStatus[playerid] = 2; //Status set to 2 announces the fact the suit is "loose", however this is not currently needed } return 1; } if (strcmp("/suits", cmdtext, true, 6) == 0) //This command lists the available suits (obvious) { GameTextForPlayer(playerid, "~r~1 - Shark~n~~p~2 - Dolphin~n~~r~3 - Turtle", 5000, 3); return 1; } if (strcmp("/suithelp", cmdtext, true, 9) == 0) { SendClientMessage(playerid,0xFF0000AA,"SeaSuit Commands:"); SendClientMessage(playerid,0xFF6600AA,"/ssuit <1-3> - Gives you a suit"); SendClientMessage(playerid,0xFFFF00AA,"/lsuit - Drops the suit at your current position"); SendClientMessage(playerid,0x00FF00AA,"/dsuit - Despawns the suit (deletes)"); SendClientMessage(playerid,0x00FFFFAA,"/suits - Lists available suits"); return 1; } dcmd(ssuit, 5, cmdtext); // "Activates" /ssuit !!Do Not Delete!! return 0; } dcmd_ssuit(playerid, params[]) { new suitnumber; if (sscanf(params, "i", suitnumber)) SendClientMessage(playerid, 0xFF00FFAA, "Usage: /ssuit [Suit Number]"); //Ensures command is properly typed and saves the suit integer to correct variable else if (suitnumber > 3 || suitnumber < 1 || suitnumber == 0) SendClientMessage(playerid, 0xFF00FFAA, "Suit Number must be 1,2 or 3. Consult /suits"); // Ensures no suits out of the 1-3 range are requested else { if(SuitStatus[playerid] != 0) DestroyObject(SeaSuit[playerid]); // Deletes any old suits GameTextForPlayer(playerid, "~b~Enjoy your ~r~SeaSuit!",3000,3); switch(suitnumber){ case 1: // Shark { SeaSuit[playerid] = CreateObject(1608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); AttachObjectToPlayer(SeaSuit[playerid], playerid, 0.0, -2.0, 0.0, 0.0, 0.0, 0.0); SuitStatus[playerid] = 1608; } case 2: // Dolphin { SeaSuit[playerid] = CreateObject(1607, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); AttachObjectToPlayer(SeaSuit[playerid], playerid, 0.0, -0.2, 0.2, 0.0, 0.0, 0.0); SuitStatus[playerid] = 1607; } case 3: // Turtle { SeaSuit[playerid] = CreateObject(1609, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); AttachObjectToPlayer(SeaSuit[playerid], playerid, -0.10, 0.0, 0.27, 0.0, 0.0, 0.0); SuitStatus[playerid] = 1609; } } } return 1; } stock sscanf(string[], format[], {Float,_}:...) //This allows use of Sscanf, !!DO Not Delete!! { new formatPos = 0, stringPos = 0, paramPos = 2, paramCount = numargs(); while (paramPos < paramCount && string[stringPos]) { switch (format[formatPos++]) { case '\0': { return 0; } case 'i', 'd': { new neg = 1, num = 0, ch = string[stringPos]; if (ch == '-') { neg = -1; ch = string[++stringPos]; } do { stringPos++; if (ch >= '0' && ch <= '9') { num = (num * 10) + (ch - '0'); } else { return 1; } } while ((ch = string[stringPos]) && ch != ' '); setarg(paramPos, 0, num * neg); } case 'h', 'x': { new ch, num = 0; while ((ch = string[stringPos++])) { switch (ch) { case 'x', 'X': { num = 0; continue; } case '0' .. '9': { num = (num << 4) | (ch - '0'); } case 'a' .. 'f': { num = (num << 4) | (ch - ('a' - 10)); } case 'A' .. 'F': { num = (num << 4) | (ch - ('A' - 10)); } case ' ': { break; } default: { return 1; } } } setarg(paramPos, 0, num); } case 'c': { setarg(paramPos, 0, string[stringPos++]); } case 'f': { new tmp[25]; strmid(tmp, string, stringPos, stringPos+sizeof(tmp)-2); setarg(paramPos, 0, _:floatstr(tmp)); } case 's', 'z': { new i = 0, ch; if (format[formatPos]) { while ((ch = string[stringPos++]) && ch != ' ') { setarg(paramPos, i++, ch); } if (!i) return 1; } else { while ((ch = string[stringPos++])) { setarg(paramPos, i++, ch); } } stringPos--; setarg(paramPos, i, '\0'); } default: { continue; } } while (string[stringPos] && string[stringPos] != ' ') { stringPos++; } while (string[stringPos] == ' ') { stringPos++; } paramPos++; } while (format[formatPos] == 'z') formatPos++; return format[formatPos]; }