forward MineTimer(playerid); public MineTimer(playerid) { new string[124]; new Count2; for(new i = 0; i < MAX_PLAYERS; i++) if(IsPlayerConnected(i)) { if(IsPlayerInRangeOfPoint(i, 2.0, MinePos[playerid][0], MinePos[playerid][1], MinePos[playerid][2])) { if(GetPlayerState(i) != PLAYER_STATE_WASTED) { CreateExplosion(MinePos[i][0], MinePos[i][1], MinePos[i][2], 7, 30.0); SendClientMessage(i,COLOR_INDIANRED,"You got blown away by a land mine."); DestroyObject(MineObject); DeletePlayer3DTextLabel(i,MineLabel[i]); MinePlaced[i] = 0; KillTimer(MineTimerUpdate[i]); } } else if(IsPlayerInRangeOfPoint(i, 2.0, MinePos[playerid][0], MinePos[playerid][1], MinePos[playerid][2]) && GetPlayerState(i) == PLAYER_STATE_DRIVER) { if(GetPlayerState(i) != PLAYER_STATE_WASTED) { CreateExplosion(MinePos[i][0], MinePos[i][1], MinePos[i][2], 7, 30.0); SendClientMessage(i,COLOR_INDIANRED,"Your vehicle touched a land mine."); DestroyObject(MineObject); DeletePlayer3DTextLabel(i,MineLabel[i]); MinePlaced[i] = 0; KillTimer(MineTimerUpdate[i]); } } else if(IsPlayerInRangeOfPoint(i, 10.0, MinePos[playerid][0], MinePos[playerid][1], MinePos[playerid][2])) { Count2++; format(string,sizeof(string),"!DANGER ZONE!\nWatch your steps"); UpdatePlayer3DTextLabelText(i,MineLabel[i], COLOR_RED,string); MineBar[i] = CreatePlayerTextDraw(i, 134.871246, 302.916717, "usebox"); PlayerTextDrawLetterSize(i, MineBar[i], 0.000000, 1.639824); PlayerTextDrawTextSize(i, MineBar[i], 39.698383, 0.000000); PlayerTextDrawAlignment(i, MineBar[i], 1); PlayerTextDrawColor(i, MineBar[i], 0); PlayerTextDrawUseBox(i, MineBar[i], true); PlayerTextDrawBoxColor(i, MineBar[i], -570405291); PlayerTextDrawSetShadow(i, MineBar[i], 0); PlayerTextDrawSetOutline(i, MineBar[i], 0); PlayerTextDrawFont(i, MineBar[i], 0); PlayerTextDrawShow(i, MineBar[i]); MineBar2[i] = CreatePlayerProgressBar(i, 45.000000, 305.000000, 88.000000, 12.000000, -16447233, 10.000000, BAR_DIRECTION_RIGHT); ShowPlayerProgressBar(i,MineBar2[i]); SetPlayerProgressBarValue(i, MineBar2[i], Count2); } else if(!IsPlayerInRangeOfPoint(i, 10.0, MinePos[playerid][0], MinePos[playerid][1], MinePos[playerid][2])) { format(string,sizeof(string),"MINE HERE"); UpdatePlayer3DTextLabelText(i,MineLabel[i], COLOR_INDIANRED, string); PlayerTextDrawDestroy(i,MineBar[i]); DestroyPlayerProgressBar(i,MineBar2[i]); } } return 1; }
CMD:placemine(playerid,params[]) { new Float:MineX,Float:MineY,Float:MineZ; new Mine[128],sec; new TMine[128]; if(MinePlaced[playerid] == 1 || TimeBombPlaced[playerid] == 1) return SendClientMessage(playerid,COLOR_INDIANRED,"You have already place a mine or bomb somewhere."); if(GetPlayerState(playerid) == PLAYER_STATE_WASTED) return SendClientMessage(playerid,COLOR_INDIANRED,"You dead bruh."); if(sscanf(params,"s[128]",Mine,TMine)) return SendClientMessage(playerid,COLOR_PAPAYAWHIP,"USAGE: /placemine [Mine]/[TMine]"); else if(!strcmp(Mine, "Mine", true)) { GetPlayerPos(playerid,MineX,MineY,MineZ); MineObject = CreateObject(1252,MineX,MineY,MineZ-1,0.0, 0.0, 96.0); MinePos[playerid][0] = MineX; MinePos[playerid][1] = MineY; MinePos[playerid][2] = MineZ; SendClientMessage(playerid,COLOR_PURPLE,"You have placed a mine."); MinePlaced[playerid] = 1; for(new i = 0; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { MineLabel[i] = CreatePlayer3DTextLabel(i,"MINE HERE",COLOR_INDIANRED, MineX, MineY, MineZ,20.0); MineTimerUpdate[i] = SetTimerEx("MineTimer", 1000, true,"i",i); } } }
Originally Posted by Ramblings
You may have some luck and more ease using the zone streamer to create and delete zones, and use the OnPlayerEnterDynamicArea, OnPlayerLeaveDynamicArea (I THINK those are the callbacks it introduces).
https://sampforum.blast.hk/showthread.php?tid=102865 It'll simply mean you don't need to really have the timer, as the plugin will do that for you. However in saying that, you'll also need to redo your 3dtext to the streamers functions as it also streams those as well. Don't confuse PlayerTextDraw for 3DText. With the streamer you can make areas that are cylinders around the mines. 1 being 10, another being 2 on each mine. This will give you a callback situation for each of your mines, and not rely so much on the timer. |
else if(!IsPlayerInRangeOfPoint(i, 10.0, MinePos[playerid][0], MinePos[playerid][1], MinePos[playerid][2]))
{
// Not needed format(string,sizeof(string),"MINE HERE");
// Not needed UpdatePlayer3DTextLabelText(i,MineLabel[i], COLOR_INDIANRED, string);
PlayerTextDrawHide(i,MineBar[i]);
DestroyPlayerProgressBar(i,MineBar2[i]);
}