#include #define MAX_GRAFFITIS 180 #define MAX_GRAFFITI_TEXT 40 #define MAX_GRAFFITI_FONT 32 static Float:GraffitiX[MAX_GRAFFITIS]; static Float:GraffitiY[MAX_GRAFFITIS]; static Float:GraffitiZ[MAX_GRAFFITIS]; static Float:GraffitiRX[MAX_GRAFFITIS]; static Float:GraffitiRY[MAX_GRAFFITIS]; static Float:GraffitiRZ[MAX_GRAFFITIS]; static GraffitiObject[MAX_GRAFFITIS]; static GraffitiText[MAX_GRAFFITIS][MAX_GRAFFITI_TEXT]; static GraffitiFont[MAX_GRAFFITIS][MAX_GRAFFITI_FONT]; static GraffitiSize[MAX_GRAFFITIS]; static GraffitiColor[MAX_GRAFFITIS]; static Iterator:Graffiti; static const s_arrGraffitiColors[][] = { "{FFFFCC}FFFFCC", "{FFFF99}FFFF99", "{FFFF66}FFFF66", "{FFFF33}FFFF33", "{FFFF00}FFFF00", "{CCCC00}CCCC00", "{FF9900}FF9900", "{FF9933}FF9933", "{CC9966}CC9966", "{CC6600}CC6600", "{996633}996633", "{663300}663300", "{FF6633}FF6633", "{CC3300}CC3300", "{FF3300}FF3300", "{FF0000}FF0000", "{CC0000}CC0000", "{990000}990000", "{FFCCCC}FFCCCC", "{FF9999}FF9999", "{FF6666}FF6666", "{FF3333}FF3333", "{FF0033}FF0033", "{CC0033}CC0033", "{FF6699}FF6699", "{FF3366}FF3366", "{FF0066}FF0066", "{CC3366}CC3366", "{996666}996666", "{663333}663333", "{FF99CC}FF99CC", "{FF3399}FF3399", "{FF0099}FF0099", "{CC0066}CC0066", "{993366}993366", "{660033}660033", "{CC99FF}CC99FF", "{9933CC}9933CC", "{9933FF}9933FF", "{9900FF}9900FF", "{660099}660099", "{663366}663366", "{9966CC}9966CC", "{9966FF}9966FF", "{6600CC}6600CC", "{6633CC}6633CC", "{663399}663399", "{330033}330033", "{CCCCFF}CCCCFF", "{9999FF}9999FF", "{6633FF}6633FF", "{6600FF}6600FF", "{330099}330099", "{330066}330066", "{6699FF}6699FF", "{3366FF}3366FF", "{0000FF}0000FF", "{0000CC}0000CC", "{0033CC}0033CC", "{000033}000033", "{0066FF}0066FF", "{0066CC}0066CC", "{3366CC}3366CC", "{0033FF}0033FF", "{003399}003399", "{003366}003366", "{99CCFF}99CCFF", "{3399FF}3399FF", "{0099FF}0099FF", "{6699CC}6699CC", "{336699}336699", "{006699}006699", "{99CCCC}99CCCC", "{66CCCC}66CCCC", "{339999}339999", "{669999}669999", "{006666}006666", "{336666}336666", "{99FFCC}99FFCC", "{66FFCC}66FFCC", "{33FFCC}33FFCC", "{00FFCC}00FFCC", "{33CCCC}33CCCC", "{009999}009999", "{CCFFCC}CCFFCC", "{99CC99}99CC99", "{66CC66}66CC66", "{669966}669966", "{336633}336633", "{003300}003300", "{33FF33}33FF33", "{00FF33}00FF33", "{00FF00}00FF00", "{00CC00}00CC00", "{33CC33}33CC33", "{00CC33}00CC33", "{66FF00}66FF00", "{66FF33}66FF33", "{33FF00}33FF00", "{33CC00}33CC00", "{339900}339900", "{009900}009900", "{CCFF99}CCFF99", "{99FF66}99FF66", "{66CC00}66CC00", "{66CC33}66CC33", "{669933}669933", "{336600}336600", "{99FF00}99FF00", "{99FF33}99FF33", "{99CC66}99CC66", "{99CC00}99CC00", "{99CC33}99CC33", "{669900}669900", "{FFFFFF}FFFFFF", "{CCCCCC}CCCCCC", "{999999}999999", "{666666}666666", "{333333}333333", "{000000}000000" }; static const s_arrGraffitiColorText[][] = { "{FFFFCC}", "{FFFF99}", "{FFFF66}", "{FFFF33}", "{FFFF00}", "{CCCC00}", "{FF9900}", "{FF9933}", "{CC9966}", "{CC6600}", "{996633}", "{663300}", "{FF6633}", "{CC3300}", "{FF3300}", "{FF0000}", "{CC0000}", "{990000}", "{FFCCCC}", "{FF9999}", "{FF6666}", "{FF3333}", "{FF0033}", "{CC0033}", "{FF6699}", "{FF3366}", "{FF0066}", "{CC3366}", "{996666}", "{663333}", "{FF99CC}", "{FF3399}", "{FF0099}", "{CC0066}", "{993366}", "{660033}", "{CC99FF}", "{9933CC}", "{9933FF}", "{9900FF}", "{660099}", "{663366}", "{9966CC}", "{9966FF}", "{6600CC}", "{6633CC}", "{663399}", "{330033}", "{CCCCFF}", "{9999FF}", "{6633FF}", "{6600FF}", "{330099}", "{330066}", "{6699FF}", "{3366FF}", "{0000FF}", "{0000CC}", "{0033CC}", "{000033}", "{0066FF}", "{0066CC}", "{3366CC}", "{0033FF}", "{003399}", "{003366}", "{99CCFF}", "{3399FF}", "{0099FF}", "{6699CC}", "{336699}", "{006699}", "{99CCCC}", "{66CCCC}", "{339999}", "{669999}", "{006666}", "{336666}", "{99FFCC}", "{66FFCC}", "{33FFCC}", "{00FFCC}", "{33CCCC}", "{009999}", "{CCFFCC}", "{99CC99}", "{66CC66}", "{669966}", "{336633}", "{003300}", "{33FF33}", "{00FF33}", "{00FF00}", "{00CC00}", "{33CC33}", "{00CC33}", "{66FF00}", "{66FF33}", "{33FF00}", "{33CC00}", "{339900}", "{009900}", "{CCFF99}", "{99FF66}", "{66CC00}", "{66CC33}", "{669933}", "{336600}", "{99FF00}", "{99FF33}", "{99CC66}", "{99CC00}", "{99CC33}", "{669900}", "{FFFFFF}", "{CCCCCC}", "{999999}", "{666666}", "{333333}", "{000000}" }; timer UpdateGraffiti[1000](playerid, grafid, letter) { if(!IsPlayerInRangeOfPoint(playerid, 10.0, GraffitiX[grafid], GraffitiY[grafid], GraffitiZ[grafid])) { Iter_Remove(Graffiti, grafid); DestroyDynamicObject(GraffitiObject[grafid]); return true; } if(!IsPlayerInRangeOfPoint(playerid, 4.0, GraffitiX[grafid], GraffitiY[grafid], GraffitiZ[grafid])) { defer UpdateGraffiti(playerid, grafid, letter); return true; } if(!IsPlayerFacingPoint(playerid, GraffitiX[grafid], GraffitiY[grafid], 20)) { defer UpdateGraffiti(playerid, grafid, letter); return true; } if(GetPlayerWeapon(playerid) != 41) { defer UpdateGraffiti(playerid, grafid, letter); return true; } switch(GetPlayerAnimationIndex(playerid)) { case 640, 1158..1164, 1167: { new keys, updown, leftright; GetPlayerKeys(playerid, keys, updown, leftright); if(keys != 4 && keys != 132) { defer UpdateGraffiti(playerid, grafid, letter); return true; } new graf[40]; strmid(graf, GraffitiText[grafid], 0, letter); SetDynamicObjectMaterialText(GraffitiObject[grafid], 0, graf, OBJECT_MATERIAL_SIZE_256x128, GraffitiFont[grafid], GraffitiSize[grafid], 0, 0xFFFFFFFF, 0, 1); if(strlen(graf) != strlen(GraffitiText[grafid])) defer UpdateGraffiti(playerid, grafid, letter + 1); else Debug(playerid, "Your graffiti is finished. ID: %d, Graffiti count: %d.", grafid, Iter_Count(Graffiti)); } default: defer UpdateGraffiti(playerid, grafid, letter); } return true; } hook OnPlayerEditDynamicObj(playerid, STREAMER_TAG_OBJECT:objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz) { new grafid = GetPVarInt(playerid, "EditingGraffitiID"); if(objectid == GraffitiObject[grafid]) { if(response == EDIT_RESPONSE_FINAL) { GraffitiX[grafid] = x; GraffitiY[grafid] = y; GraffitiZ[grafid] = z; GraffitiRX[grafid] = rx; GraffitiRY[grafid] = ry; GraffitiRZ[grafid] = rz; SetDynamicObjectMaterialText(objectid, 0, " ", OBJECT_MATERIAL_SIZE_256x128, GraffitiFont[grafid], GraffitiSize[grafid], 0, 0xFFFFFFFF, 0, 1); Debug(playerid, "Please start spraying."); defer UpdateGraffiti(playerid, grafid, 9); } else if(response == EDIT_RESPONSE_CANCEL) { Iter_Remove(Graffiti, grafid); DestroyDynamicObject(objectid); } } } Graffiti_Create(playerid, step) { switch(step) { case 1: // Color { inline _response(response, listitem, string:inputtext[]) { #pragma unused inputtext if(!response) return 0; SetPVarInt(playerid, "GraffitiColor", listitem); Graffiti_Create(playerid, 2); } new string[1924]; for(new i; i < sizeof(s_arrGraffitiColors); i++) { strcat(string, va_return("%s\n", s_arrGraffitiColors[i])); } Dialog_ShowCallback(playerid, using inline _response, DIALOG_STYLE_LIST, "Graffiti Color", string, "Next", "Close"); } case 2: // Size { inline _response(response, listitem, string:inputtext[]) { #pragma unused listitem if(!response) return Graffiti_Create(playerid, 1); new size = strval(inputtext); if(!(5 <= size <= 50)) { SendErrorMessage(playerid, "The graffiti size must be between 5 and 50."); return Graffiti_Create(playerid, 2); } SetPVarInt(playerid, "GraffitiSize", size); Graffiti_Create(playerid, 3); } Dialog_ShowCallback(playerid, using inline _response, DIALOG_STYLE_INPUT, "Graffiti Size", "{b3b3b3}Choose the graffiti size.\n\n{eeeeee}Must be between 5 and 50.", "Next", "Back"); } case 3: // Text { inline _response(response, listitem, string:inputtext[]) { #pragma unused listitem if(!response) return Graffiti_Create(playerid, 2); new length = strlen(inputtext); if(!(0 < length < MAX_GRAFFITI_TEXT)) { SendErrorMessageF(playerid, "The graffiti text must be between 0 and %d characters", MAX_GRAFFITI_TEXT - 1); return Graffiti_Create(playerid, 2); } new id = Iter_Free(Graffiti); if(id == INVALID_ITERATOR_SLOT) return SendErrorMessage(playerid, "The maximum number of graffiti on the server has been reached."); new Float:x, Float:y, Float:z, Float:a; GetPlayerPos(playerid, x, y, z); GetPlayerFacingAngle(playerid, a); format(GraffitiFont[id], MAX_GRAFFITI_FONT, "Arial"); format(GraffitiText[id], MAX_GRAFFITI_TEXT, inputtext); strins(GraffitiText[id], s_arrGraffitiColorText[GetPVarInt(playerid, "GraffitiColor")], 0); GraffitiObject[id] = CreateDynamicObject(19482, x, y, z, 0.0, 0.0, 270.0 + a, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid)); GraffitiSize[id] = GetPVarInt(playerid, "GraffitiSize") * 5; GraffitiColor[id] = GetPVarInt(playerid, "GraffitiColor"); ApplyAnimation(playerid, "CARRY", "crry_prtial", 4.0, 0, 0, 0, 0, 0, 1); SetPVarInt(playerid, "EditingGraffitiID", id); SetDynamicObjectMaterialText(GraffitiObject[id], 0, GraffitiText[id], OBJECT_MATERIAL_SIZE_256x128, GraffitiFont[id], GraffitiSize[id], 0, 0xFFFFFFFF, 0, 1); EditDynamicObject(playerid, GraffitiObject[id]); Iter_Add(Graffiti, id); } Dialog_ShowCallback(playerid, using inline _response, DIALOG_STYLE_INPUT, "Graffiti Text", "{b3b3b3}Input the graffiti text.", "Submit", "Back"); } } return 1; } CMD:graffiti(playerid, params[]) { if(IsPlayerWounded(playerid)) return SendErrorMessage(playerid, "You can't do this while wounded."); if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT) return SendErrorMessage(playerid, "You need to be onfoot in order to do this."); if(GetPlayerWeapon(playerid) != 41) return SendErrorMessage(playerid, "You need a spraycan in order to do this."); Graffiti_Create(playerid, 1); ApplyAnimation(playerid, "GRAFFITI", "spraycan_fire", 4.1, 1, 1, 1, 0, 0, 1); return 1; } CMD:deletegraffiti(playerid, params[]) { new grafid; if(sscanf(params, "i", grafid)) return SendSyntaxMessage(playerid, "/deletegraffiti (id)"); if(!Iter_Contains(Graffiti, grafid)) return SendErrorMessage(playerid, "That graffiti ID is not valid."); return 1; }