16.07.2013, 13:29
(
Последний раз редактировалось exclide1; 16.07.2013 в 14:09.
)
Alright, I'll start off by saying that I'm new to scripting, so my code will be ugly, but it should work! If you have suggestions to improve it, please tell.
I'll be using Streamer plugin and YSI\y_commands.
First of all, you'll need to create robbery checkpoints. I'll be creating two robbery checkpoints in Caligulas Palace and 4 Dragons Casino:
Then we proceed to create them under OnFilterScriptInit(), if you're doing this in FS or under OnGameModeInit(). I suggest the first, so you don't get confused.
Then we need to decide what happens, when the player enters the created checkpoints! So under streamer's callback you put:
So when they enter either of those checkpoints, they'll see this message! Now you need to decide what happens when they actually write the command, I'm using y_commands, so should be you, as it's much easier, then the default method:
For getting players count in the checkpoint:
Now let's get to the robbery timer, you'll want to forward it somewhere at top of your script:
But I don't remember us actually creating finish checkpoints for hideouts, you'd say and will be right! Create them at the same place, where you created robbery checkpoints:
Don't forget to toggle those checkpoints to zero, when players connect!
And when someone dies while robbing, it means the robbery is over:
Now we still didn't decide what happens when the player reaches the hideout/enter the finish checkpoint:
That's almost it! Now if the player, who's robbing the casino disconnects, we need to set the variables back to zero, so other players can rob:
That's it! I hope you understand something from this tutorial, because I surely wouldn't, if I weren't to write it! If you know how I can improve it, let me know!
I'll be using Streamer plugin and YSI\y_commands.
First of all, you'll need to create robbery checkpoints. I'll be creating two robbery checkpoints in Caligulas Palace and 4 Dragons Casino:
pawn Код:
new caligulacheck;
new dragoncheck;
pawn Код:
public OnFilterScriptInit()
{
caligulacheck = CreateDynamicCP(2144.2002,1635.9196,993.5761, 2, -1, -1, -1, 150); //x,y,z,checkpoint size,worldid,interiorid,playerid to be shown only for him,stream distance
dragoncheck = CreateDynamicCP(1929.9324,1036.7157,994.4750, 2, 0, -1, -1, 100);
return 1;
}
pawn Код:
public OnPlayerEnterDynamicCP(playerid, checkpointid)
{
if(checkpointid == caligulacheck || checkpointid == dragoncheck)
{
SendClientMessage(playerid, COLOR_YELLOW, "Type /robbery to start it.");
}
return 1;
}
pawn Код:
CMD:robbery(playerid, params[])
{
if(IsPlayerInDynamicCP(playerid, caligulacheck)) //we check if the player is standing in the checkpoint, when they type /robbery
{
if(GetPlayersInRobberyCP(GetPlayerTeam(playerid), caligulacheck) <3) return SendClientMessage(playerid, COLOR_RED, "You need at least 3 gang members at the chechpoint to start the robbery."); //custom function to see how many team members there are at the checkpoint, I'll explain later
if(GetTickCount() - endCaligulas < 60000*5) return SendClientMessage(playerid, COLOR_RED, "Caligula's Palace has been robbed recently."); //this is so players don't rob the place too frequently. endCaligulas variable is set to tickcount() when the player finishes the robbery and then you're checking if the tickcount() at the moment of typing the command minus the tickcount is less then 5 minutes (60000ms*5) and if so, return them with the message and not proceed the code further!
if(caligulaRobbery == 1) return SendClientMessage(playerid, COLOR_RED, "A robbery is already in progress."); //check if the robbery already in progress, if so, return with client message and stop the code from proceeding further!
if(GetPlayerTeam(playerid) == 4) return SendClientMessage(playerid, COLOR_RED, "You can't rob your own casino."); //now this checks if the player, who's trying to rob the place is in team "4". Team 4 owns the casino, so they can't rob it, change it accordingly to your teams
RobbingCaligulas[playerid] = 1; //set playerid variable so we can track if that player dies or disconnects and end the robbery
caligulaRobbery = 1; //set the robbery variable so it can't get robbed, while someone is robbing!
RobberyFormat(playerid); //custom function to display gametext and message for the player, so you don't have to write it every time you create new casino checkpoint
SendClientMessageToTeam(playerid, 4, COLOR_BLUE, "[Team]Caligula's Palace is being robbed. Defend it and get rewarded."); //custom functions which loops through all players, checks their team id and sends message to the team, who owns the casino
}
else {SendClientMessage(playerid, COLOR_RED, "You must be at casino robbery checkpoint.");} //if they aren't in the checkpoint
if(IsPlayerInDynamicCP(playerid, dragoncheck)) //same goes for below
{
if(GetPlayersInRobberyCP(GetPlayerTeam(playerid), dragoncheck) <1) return SendClientMessage(playerid, COLOR_RED, "You need at least 3 gang members at the chechpoint to start the robbery.");
if(GetTickCount() - endDragons < 60000*5) return SendClientMessage(playerid, COLOR_RED, "The Four Dragons Casino has been robbed recently.");
if(dragonRobbery == 1) return SendClientMessage(playerid, COLOR_RED, "A robbery is already in progress.");
if(GetPlayerTeam(playerid) == 5) return SendClientMessage(playerid, COLOR_RED, "You can't rob your own casino.");
RobbingDragons[playerid] = 1;
dragonRobbery = 1;
RobberyFormat(playerid);
}
else {SendClientMessage(playerid, COLOR_RED, "You must be at casino robbery checkpoint.");}
return 1;
}
//I'll explain the custom functions now! This is the format:
stock RobberyFormat(playerid)
{
GameTextForPlayer(playerid, "~w~ROBBERY IN PROGRESS~n~~y~STAY IN THE~n~~r~RED CHECKPOINT", 1000, 3); //shows gametext for player for 1 second
SendClientMessage(playerid, COLOR_BLUE, "Robbery initialized. Stand in the checkpoint for 20 seconds.");
ApplyAnimation(playerid, "SHOP", "ROB_Loop_Threat", 4.0, 1, 0, 0, 0, 0); //applies robbery animation
robtimer[playerid] = SetTimerEx("robtimerN",2000,1,"i",playerid); //sets the robbery timer, which checks if the player is still in the CP and time he's been
new robberTeam = GetPlayerTeam(playerid);
new robberName[24];
new string[128];
GetPlayerName(playerid, robberName, 24);
format(string,sizeof(string),"[Team]%s has started robbery at %s.", robberName, robberyPlace(playerid)); //robberyPlace is a custom function which returns string with casino's name, depending on the checkpoint you standing at
SendClientMessageToTeam(playerid, robberTeam, COLOR_BLUE, string); //sends message to team of the robber, so they can assist him
return 1;
}
pawn Код:
stock GetPlayersInRobberyCP(teamid, checkpointid)
{
new count;
for(new i=0; i < MAX_PLAYERS; i++) //loops through all players
{
if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid && IsPlayerInDynamicCP(i, checkpointid)) //checks if they're connected, checks if their team is the same of robbers team and check if they're at the specified checkpoint
{
count++; //increase the variable by one for everyone who meets the criteria above, so if there are 3 players of team id 3 standing in the specified checkpoint, it will return "3"!
}
}
return count;
}
stock robberyPlace(playerid) //robberyPlace is a custom function which returns string with casino's name, depending on the checkpoint you standing at
{
new place[30];
if(IsPlayerInDynamicCP(playerid, caligulacheck)) format(place,sizeof(place),"Caligula's Palace");
if(IsPlayerInDynamicCP(playerid, dragoncheck)) format(place,sizeof(place),"The Four Dragons Casino");
return place;
}
stock SendClientMessageToTeam(playerid, team, color, text[]) //this is YSI's custom function, I added playerid here so it doesn't send the message to the player, who's robbing
{
new ret=0;
for(new i = 0; i < MAX_PLAYERS; i++) //loops through all players
{
if(IsPlayerConnected(i) && GetPlayerTeam(i) == team && playerid != i) //checks if they're connected, checks if their team is the same of robbers team and they're not the player, who's robbing
{
SendClientMessage(i, color, text); //send specified message with specified color
ret++;
}
}
return ret;
}
stock GiveTeamMoney(playerid, team, cash) //giving money for specified team, works the same as above, but sends money, instead of message
{
new ret=0;
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && GetPlayerTeam(i) == team && playerid != i)
{
GivePlayerMoney(i, cash);
ret++;
}
}
return ret;
}
pawn Код:
public robtimerN(playerid)
{
new robberTeam = GetPlayerTeam(playerid);
new robberName[24];
GetPlayerName(playerid, robberName, 24);
count5++; //adds one to the count var
GameTextForPlayer(playerid, "~w~ROBBERY IN PROGRESS~n~~y~STAY IN THE~n~~r~RED CHECKPOINT", 1000, 3); //shows the gametext for one second, as this timer repeats itself every 2 seconds, this text will be flashing
if(RobbingCaligulas[playerid] == 1) //if the player is robbing Caligulas Palace
{
if(!IsPlayerInDynamicCP(playerid, caligulacheck)) //if he moved out of the checkpoint
{
SendClientMessage(playerid, COLOR_RED, "Robbery failed."); //it will send him fail message
RobbingCaligulas[playerid] = 0; //set the variables back to zero, so people can rob it further
caligulaRobbery = 0;
KillTimer(robtimer[playerid]); //kill this timer
new string[128];
format(string,sizeof(string),"[Team]%s has failed the robbery at %s.", robberName, robberyPlace(playerid)); //send message to his team, so they know he failed the robbery
SendClientMessageToTeam(playerid, robberTeam, COLOR_BLUE, string);
count5 = 0; //reset the count
}
}
if(RobbingDragons[playerid] == 1) //same as above
{
if(!IsPlayerInDynamicCP(playerid, dragoncheck))
{
SendClientMessage(playerid, COLOR_RED, "Robbery failed.");
RobbingDragons[playerid] = 0;
dragonRobbery = 0;
KillTimer(robtimer[playerid]);
new string[128];
format(string,sizeof(string),"[Team]%s has failed the robbery at %s.", robberName, robberyPlace(playerid));
SendClientMessageToTeam(playerid, robberTeam, COLOR_BLUE, string);
count5 = 0;
}
}
if(count5 >= 10) //if the count reaches 10, and as the timer is repeating itself every 2 seconds, it will reach it after 20 seconds
{
SendClientMessage(playerid, COLOR_BLUE, "You have succesfully robbed the safe from the Caligula's Casino. Follow the red checkpoint."); //let the player know he succeed
GameTextForPlayer(playerid, "~y~BRING THE SAFE TO THE~n~~r~RED CHECKPOINT", 10000, 3);
new test[] = "12"; //this is an array with 3 numbers! 0 1 2.
#pragma unused test //this is so it doesn't show the stupid warning message
new rand = random(sizeof(test)); //gets random number from the 'test' array to create our hideouts randomly!
if(rand == 0)
{
finishIcon[playerid] = CreateDynamicMapIcon(1048.7190,2908.7190,47.8231, 0, COLOR_RED, -1, -1, playerid, 10000.0); //creats map icon pointing to the hideout place (checkpoint)
TogglePlayerDynamicCP(playerid, finishCheck1, 1); //finishCheck1 is the first hideout checkpoint, toggling it to '1' so the player can see and enter it
}
if(rand == 1)
{
finishIcon[playerid] = CreateDynamicMapIcon(-902.6438,2687.7029,41.9304, 0, COLOR_RED, -1, -1, playerid, 10000.0);
TogglePlayerDynamicCP(playerid, finishCheck2, 1);
}
if(rand == 2)
{
finishIcon[playerid] = CreateDynamicMapIcon(869.0721,-30.8067,62.7581, 0, COLOR_RED, -1, -1, playerid, 10000.0);
TogglePlayerDynamicCP(playerid, finishCheck3, 1);
}
ClearAnimations(playerid); //
TogglePlayerDynamicCP(playerid, caligulacheck, 0); //toggles the robbery checkpoints player is standing at to 0, so he doesn't see them and so if wont confuse him
TogglePlayerDynamicCP(playerid, dragoncheck, 0);
new string[128];
format(string,sizeof(string),"[Team]%s has robbed the safe at %s, help him deliver it to the hideout!", robberName, robberyPlace(playerid));
SendClientMessageToTeam(playerid, robberTeam, COLOR_BLUE, string); //sends a message to the robbers team, so they can help him to get to the hideout
count5 = 0; //resets the count
KillTimer(robtimer[playerid]); //
}
return 1;
}
pawn Код:
finishCheck1 = CreateDynamicCP(1048.7190,2908.7190,47.8231, 4, -1, -1, -1, 100);
finishCheck2 = CreateDynamicCP(-902.6438,2687.7029,41.9304, 4, -1, -1, -1, 100);
finishCheck3 = CreateDynamicCP(869.0721,-30.8067,62.7581, 4, -1, -1, -1, 100);
pawn Код:
public OnPlayerConnect(playerid)
{
TogglePlayerDynamicCP(playerid, caligulacheck, 1);
TogglePlayerDynamicCP(playerid, dragoncheck, 1);
TogglePlayerDynamicCP(playerid, clowncheck, 1);
TogglePlayerDynamicCP(playerid, finishCheck1, 0);
TogglePlayerDynamicCP(playerid, finishCheck2, 0);
TogglePlayerDynamicCP(playerid, finishCheck3, 0);
return 1;
}
pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
if(RobbingCaligulas[playerid] == 1) //if the player that died started the robbery
{
SendClientMessage(playerid, COLOR_RED, "Robbery failed."); //inform him that the robbery is failed!
caligulaRobbery = 0; //set the variables back to zero
RobbingCaligulas[playerid] = 0;
TogglePlayerDynamicCP(playerid, finishCheck1, 0); //toggle the finish (hideout) checkpoint back to zero, so he wont be able to see and enter it and get the money
KillTimer(robtimer[playerid]); //kill the timer
DestroyDynamicMapIcon(finishIcon[playerid]); //destroy the icon that we created earlier
}
if(RobbingDragons[playerid] == 1) //the same goes for this
{
SendClientMessage(playerid, COLOR_RED, "Robbery failed.");
dragonRobbery = 0;
RobbingDragons[playerid] = 0;
TogglePlayerDynamicCP(playerid, finishCheck1, 0);
KillTimer(robtimer[playerid]);
DestroyDynamicMapIcon(finishIcon[playerid]);
}
if(RobbingCaligulas[playerid] == 1 && GetPlayerTeam(killerid) == 4) //now this actually checks if the dead player was robbing caligulas and if the player who killed him is in a team, who owns the casino and if so...
{
new string[128];
new pName[24];
GetPlayerName(killerid, pName, 24);
GivePlayerCash(killerid, ROBBERY_REWARD / 2); //reward the player, who defended the casino with half of money that the robbing player was supposed to get, you have to define that amount somewhere at top of your script
format(string,sizeof(string),"[Team]%s has stopped the robbery and gets %d in reward.", pName, ROBBERY_REWARD / 2); //formats the message
SendClientMessageToTeam(playerid, 4, COLOR_BLUE, string); //sends message to the casino defending players team
}
if(RobbingDragons[playerid] == 1 && GetPlayerTeam(killerid) == 5) //same one, but different team
{
new string[128];
new pName[24];
GetPlayerName(killerid, pName, 24);
GivePlayerCash(killerid, ROBBERY_REWARD / 2);
format(string,sizeof(string),"[Team]%s has stopped the robbery and gets %d in reward.", pName, ROBBERY_REWARD / 2);
SendClientMessageToTeam(playerid, 5, COLOR_BLUE, string);
}
TogglePlayerDynamicCP(playerid, caligulacheck, 1); //toggles the robbery checkpoints back to 1, so they can see and enter them.
TogglePlayerDynamicCP(playerid, dragoncheck, 1);
return 1;
}
pawn Код:
public OnPlayerEnterDynamicCP(playerid, checkpointid)
{
new robberTeam = GetPlayerTeam(playerid);
new robberName[24];
GetPlayerName(playerid, robberName, 24);
if(checkpointid == finishCheck1 || checkpointid == finishCheck2 || checkpointid == finishCheck3) //if he's in any of the following hideout checkpoints
{
new string[128];
format(string,sizeof(string),"You have succesfully reached the hideout and cracked the safe. You receive %d$", ROBBERY_REWARD); //format with the ROBBERY_REWARD that you have defined at top of your scipt
SendClientMessage(playerid, COLOR_BLUE, string); //send the above message
GivePlayerCash(playerid, ROBBERY_REWARD); //give him defined money for completing the robbery
DestroyDynamicMapIcon(finishIcon[playerid]); //destroys the map icon
TogglePlayerDynamicCP(playerid, finishCheck1, 0); //toggles
TogglePlayerDynamicCP(playerid, finishCheck2, 0); //all the finish checkpoints
TogglePlayerDynamicCP(playerid, finishCheck3, 0); //back to zero
format(string,sizeof(string),"[Team]%s has cracked the safe and found %d$. You get bonus reward for being in the same team.", robberName, ROBBERY_REWARD);
SendClientMessageToTeam(playerid, robberTeam, COLOR_BLUE, string); //send the above message to the players team
GiveTeamCash(playerid, robberTeam, ROBBERY_REWARD / 10); //give the players team defined reward divided by 10
if(RobbingCaligulas[playerid] == 1) //if the player that entered the finish checkpoint is robbing caligulas
{
RobbingCaligulas[playerid] = 0; //set the variable back to zero
endCaligulas = GetTickCount(); //set the variable "endCaligulas" to the current tickcount(). We then use that variable to check if the specific casino has been robbed recently
caligulaRobbery = 0; //set the variable back to zero
}
if(RobbingDragons[playerid] == 1) //the same
{
RobbingDragons[playerid] = 0;
endDragons = GetTickCount();
dragonRobbery = 0;
}
TogglePlayerDynamicCP(playerid, caligulacheck, 1); //toggles back the robbery checkpoints
TogglePlayerDynamicCP(playerid, dragoncheck, 1);
}
return 1;
}
pawn Код:
public OnPlayerDisconnect(playerid)
{
if(RobbingCaligulas[playerid] == 1) //if the player that disconnected is robbing caligulas
{
caligulaRobbery = 0; //set the global variable back to zero
RobbingCaligulas[playerid] = 0;
TogglePlayerDynamicCP(playerid, finishCheck1, 0); //toggle the hideout/finish checkpoint back to zero, as the robbery if failed now
}
if(RobbingDragons[playerid] == 1) //same
{
dragonRobbery = 0;
RobbingDragons[playerid] = 0;
TogglePlayerDynamicCP(playerid, finishCheck1, 0);
}
KillTimer(robtimer[playerid]);
DestroyDynamicMapIcon(finishIcon[playerid]);
return 1;
}