10.09.2016, 17:56
Olб, tenho um gamemode de caminhoneiro, e tem esse sistema de comboios. Queria saber se vocкs podem me ajudar б fazer um CMD que dк lider para um jogador, ou seja, quando um comboio й criado quem criou vira lider, e sу ele poderia usar o CMD.
Aqui estб o sistema de comboios.
Aqui estб o sistema de comboios.
Код:
forward Convoy_Timer(Convoy);
Convoys_Init()
{
for (new i; i < MAX_CONVOYS; i++)
{
AConvoys[i][ConvoyTextLeader] = TextDrawCreate(324.000000, 399.000000, "");
TextDrawAlignment(AConvoys[i][ConvoyTextLeader], 2);
TextDrawBackgroundColor(AConvoys[i][ConvoyTextLeader], 255);
TextDrawFont(AConvoys[i][ConvoyTextLeader], 1);
TextDrawLetterSize(AConvoys[i][ConvoyTextLeader], 0.230000, 1.200000);
TextDrawColor(AConvoys[i][ConvoyTextLeader], -1);
TextDrawSetOutline(AConvoys[i][ConvoyTextLeader], 1);
TextDrawSetProportional(AConvoys[i][ConvoyTextLeader], 1);
TextDrawSetSelectable(AConvoys[i][ConvoyTextLeader], 0);
AConvoys[i][ConvoyTextMember] = TextDrawCreate(324.000000, 399.000000, "");
TextDrawAlignment(AConvoys[i][ConvoyTextMember], 2);
TextDrawBackgroundColor(AConvoys[i][ConvoyTextMember], 255);
TextDrawFont(AConvoys[i][ConvoyTextMember], 1);
TextDrawLetterSize(AConvoys[i][ConvoyTextMember], 0.230000, 1.200000);
TextDrawColor(AConvoys[i][ConvoyTextMember], -1);
TextDrawSetOutline(AConvoys[i][ConvoyTextMember], 1);
TextDrawSetProportional(AConvoys[i][ConvoyTextMember], 1);
TextDrawSetSelectable(AConvoys[i][ConvoyTextMember], 0);
AConvoys[i][FraseComboio] = TextDrawCreate(324.000000, 388.000000, "");
TextDrawAlignment(AConvoys[i][FraseComboio], 2);
TextDrawBackgroundColor(AConvoys[i][FraseComboio], 255);
TextDrawFont(AConvoys[i][FraseComboio], 1);
TextDrawLetterSize(AConvoys[i][FraseComboio], 0.230000, 1.200000);
TextDrawColor(AConvoys[i][FraseComboio], -1);
TextDrawSetOutline(AConvoys[i][FraseComboio], 1);
TextDrawSetProportional(AConvoys[i][FraseComboio], 1);
TextDrawSetSelectable(AConvoys[i][FraseComboio], 0);
}
}
Convoy_Create(playerid, Convoy)
{
new Name[24], Msg[128];
GetPlayerName(playerid, Name, sizeof(Name));
if (Convoy_PlayerAllowed(playerid))
{
AConvoys[Convoy][Status] = CONVOY_OPEN;
AConvoys[Convoy][Members][0] = playerid;
APlayerData[playerid][InConvoy] = true;
APlayerData[playerid][ConvoyID] = Convoy;
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
AConvoys[Convoy][Members][i] = -1;
AConvoys[Convoy][ConvoyTimer] = SetTimerEx("Convoy_Timer", 1000, true, "i", Convoy);
format(Msg, 128, TXT_PlayerStartsConvoy, Name);
SendClientMessageToAll(-1, Msg);
ShowPlayerDialog(playerid, 6789, DIALOG_STYLE_INPUT, "Nome do comboio:", "Digite o nome de comboio desejado:", "Colocar", "Cancelar");
}
}
Convoy_Join(playerid, Convoy)
{
new Name[24], Msg[128];
GetPlayerName(playerid, Name, sizeof(Name));
if (Convoy_PlayerAllowed(playerid))
{
if (Convoy_CountMembers(Convoy) < CONVOY_MAX_MEMBERS)
{
format(Msg, 128, TXT_PlayerJoinedConvoy, Name);
Convoy_SendMessage(Convoy, Msg);
SendClientMessage(playerid, 0xFFFFFFFF, TXT_YouJoinedConvoy);
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
if (AConvoys[Convoy][Members][i] == -1)
{
AConvoys[Convoy][Members][i] = playerid;
break;
}
}
APlayerData[playerid][InConvoy] = true;
APlayerData[playerid][ConvoyID] = Convoy;
if (Convoy_CountMembers(Convoy) == CONVOY_MAX_MEMBERS)
AConvoys[Convoy][Status] = CONVOY_FULL;
TextDrawSetString(APlayerData[playerid][MissionText], TXT_WaitingLeaderJob);
}
else
SendClientMessage(playerid, 0xFFFFFFFF, TXT_ConvoyFull);
}
}
Convoy_Leave(playerid)
{
new Convoy, NumMembers, MemberID;
if (APlayerData[playerid][InConvoy] == false)
return 1;
Convoy = APlayerData[playerid][ConvoyID];
NumMembers = Convoy_CountMembers(Convoy);
if (NumMembers == 1)
{
Convoy_Cancel(Convoy);
return 1;
}
APlayerData[playerid][InConvoy] = false;
APlayerData[playerid][ConvoyID] = 0;
TextDrawHideForPlayer(playerid, AConvoys[Convoy][ConvoyTextLeader]);
TextDrawHideForPlayer(playerid, AConvoys[Convoy][ConvoyTextMember]);
TextDrawHideForPlayer(playerid, AConvoys[Convoy][FraseComboio]);
if (APlayerData[playerid][JobStarted] == false)
TextDrawSetString(APlayerData[playerid][MissionText], Trucker_NoJobText);
if (AConvoys[Convoy][Members][0] == playerid)
{
for (new j = 1; j < CONVOY_MAX_MEMBERS; j++)
{
MemberID = AConvoys[Convoy][Members][j];
if (MemberID != -1)
{
ShowPlayerDialog(MemberID, 6789, DIALOG_STYLE_INPUT, "Nome do comboio:", "Digite o nome de comboio desejado:", "Colocar", "Cancelar");
TextDrawHideForPlayer(MemberID, AConvoys[Convoy][ConvoyTextMember]);
AConvoys[Convoy][Members][0] = MemberID;
AConvoys[Convoy][Members][j] = -1;
return 1;
}
}
}
else
{
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
{
if (AConvoys[Convoy][Members][i] == playerid)
{
AConvoys[Convoy][Members][i] = -1;
Trucker_EndJob(playerid);
return 1;
}
}
}
return 1;
}
Convoy_Cancel(Convoy)
{
new MemberID;
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
APlayerData[MemberID][InConvoy] = false;
APlayerData[MemberID][ConvoyID] = 0;
TextDrawHideForPlayer(MemberID, AConvoys[Convoy][ConvoyTextLeader]);
TextDrawHideForPlayer(MemberID, AConvoys[Convoy][ConvoyTextMember]);
TextDrawHideForPlayer(MemberID, AConvoys[Convoy][FraseComboio]);
Trucker_EndJob(MemberID);
AConvoys[Convoy][Members][i] = -1;
SendClientMessage(MemberID, 0xFFFFFFFF, TXT_LeaderCancelledConvoy);
}
}
AConvoys[Convoy][LoadID] = 0;
AConvoys[Convoy][Location1] = 0;
AConvoys[Convoy][Location2] = 0;
AConvoys[Convoy][Status] = CONVOY_EMPTY;
AConvoys[Convoy][ConvoyStep] = 0;
AConvoys[Convoy][TrailerModel] = 0;
AConvoys[Convoy][Comboiofrase] = 0;
AConvoys[Convoy][LeaderInformedTrailers] = false;
KillTimer(AConvoys[Convoy][ConvoyTimer]);
}
Convoy_StartMemberJob(playerid, Convoy)
{
new StartLoc[50], EndLoc[50], Load[50], RouteText[255], Float:x, Float:y, Float:z, LoadMsg[128];
APlayerData[playerid][JobStarted] = true;
APlayerData[playerid][LoadID] = AConvoys[Convoy][LoadID];
APlayerData[playerid][JobLoc1] = AConvoys[Convoy][Location1];
APlayerData[playerid][JobLoc2] = AConvoys[Convoy][Location2];
APlayerData[playerid][VehicleID] = GetPlayerVehicleID(playerid);
APlayerData[playerid][TrailerID] = GetVehicleTrailer(GetPlayerVehicleID(playerid));
APlayerData[playerid][JobStep] = 1;
format(StartLoc, 50, ALocations[APlayerData[playerid][JobLoc1]][LocationName]);
format(EndLoc, 50, ALocations[APlayerData[playerid][JobLoc2]][LocationName]);
format(Load, 50, ALoads[APlayerData[playerid][LoadID]][LoadName]);
format(RouteText, 255, TXT_HaulingCargoFromToPickup, Load, StartLoc, EndLoc);
TextDrawSetString(APlayerData[playerid][MissionText], RouteText);
x = ALocations[APlayerData[playerid][JobLoc1]][LocX];
y = ALocations[APlayerData[playerid][JobLoc1]][LocY];
z = ALocations[APlayerData[playerid][JobLoc1]][LocZ];
SetPlayerCheckpoint(playerid, x, y, z, 7);
APlayerData[playerid][VehicleTimerTime] = Job_TimeToFailMission;
format(LoadMsg, 128, TXT_PickupCargoAt, Load, StartLoc);
SendClientMessage(playerid, 0xFFFFFFFF, LoadMsg);
SendClientMessage(playerid, 0xFFFFFFFF, TXT_MeetOtherConvoyMembers);
}
Convoy_UpdateMemberJob(playerid)
{
new StartLoc[50], EndLoc[50], Load[50], RouteText[255], Float:x, Float:y, Float:z, UnloadMsg[128];
APlayerData[playerid][JobStep] = 3;
format(StartLoc, 50, ALocations[APlayerData[playerid][JobLoc1]][LocationName]);
format(EndLoc, 50, ALocations[APlayerData[playerid][JobLoc2]][LocationName]);
format(Load, 50, ALoads[APlayerData[playerid][LoadID]][LoadName]);
format(RouteText, 255, TXT_HaulingCargoFromToDeliver, Load, StartLoc, EndLoc);
TextDrawSetString(APlayerData[playerid][MissionText], RouteText);
x = ALocations[APlayerData[playerid][JobLoc2]][LocX];
y = ALocations[APlayerData[playerid][JobLoc2]][LocY];
z = ALocations[APlayerData[playerid][JobLoc2]][LocZ];
SetPlayerCheckpoint(playerid, x, y, z, 7);
format(UnloadMsg, 128, TXT_DeliverCargoTo, Load, EndLoc);
SendClientMessage(playerid, 0xFFFFFFFF, UnloadMsg);
}
public Convoy_Timer(Convoy)
{
new LeaderID, MemberID;
Convoy_UpdateTextDraws(Convoy);
LeaderID = AConvoys[Convoy][Members][0];
switch (AConvoys[Convoy][ConvoyStep])
{
case 0:
{
new bool:AllSameTrailer = true;
antfreez[LeaderID] = gettime() + 60;
if (APlayerData[LeaderID][JobStarted] == true)
{
AConvoys[Convoy][LoadID] = APlayerData[LeaderID][LoadID];
AConvoys[Convoy][Location1] = APlayerData[LeaderID][JobLoc1];
AConvoys[Convoy][Location2] = APlayerData[LeaderID][JobLoc2];
AConvoys[Convoy][TrailerModel] = GetVehicleModel(GetVehicleTrailer(GetPlayerVehicleID(LeaderID)));
if (AConvoys[Convoy][TrailerModel] != 0)
{
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
if (GetVehicleModel(GetVehicleTrailer(GetPlayerVehicleID(MemberID))) != AConvoys[Convoy][TrailerModel])
{
switch (AConvoys[Convoy][TrailerModel])
{
case VehicleTrailerCargo, VehicleTrailerCargo2: TextDrawSetString(APlayerData[MemberID][MissionText], TXT_MemberNeedsCargoTrailer);
case VehicleTrailerOre: TextDrawSetString(APlayerData[MemberID][MissionText], TXT_MemberNeedsOreTrailer);
case VehicleTrailerFluids: TextDrawSetString(APlayerData[MemberID][MissionText], TXT_MemberNeedsFluidsTrailer);
}
AllSameTrailer = false;
}
}
}
}
else
{
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
new vModel = GetVehicleModel(GetPlayerVehicleID(MemberID));
switch (vModel)
{
case VehicleFlatbed, VehicleDFT30: AllSameTrailer = true;
default:
{
TextDrawSetString(APlayerData[MemberID][MissionText], "Vocк precisa de um Flatbed ou DFT-30");
AllSameTrailer = false;
}
}
}
}
}
if (AllSameTrailer == true)
{
SendClientMessage(LeaderID, 0xFFFFFFFF, TXT_AllMembersSameTrailer);
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
Convoy_StartMemberJob(MemberID, Convoy);
}
AConvoys[Convoy][ConvoyStep] = 1;
AConvoys[Convoy][Status] = CONVOY_CLOSED;
}
else
{
if (AConvoys[Convoy][LeaderInformedTrailers] == false)
{
SendClientMessage(LeaderID, 0xFFFFFFFF, TXT_AllMembersNotSameTrailer);
AConvoys[Convoy][LeaderInformedTrailers] = true;
}
}
}
}
case 1:
{
new bool:AllMembersLoaded = true;
antfreez[MemberID] = gettime() + 60;
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
if (APlayerData[MemberID][JobStep] != 2)
AllMembersLoaded = false;
}
if (AllMembersLoaded == true)
{
SendClientMessage(LeaderID, 0xFFFFFFFF, TXT_AllMembersLoadedCargo);
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
Convoy_UpdateMemberJob(MemberID);
}
AConvoys[Convoy][ConvoyStep] = 2;
}
}
case 2:
{
new bool:AllMembersUnloaded = true;
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
if (APlayerData[MemberID][JobStep] != 4)
AllMembersUnloaded = false;
}
if (AllMembersUnloaded == true)
AConvoys[Convoy][ConvoyStep] = 3;
}
case 3:
{
new Float:x1, Float:y1, Float:x2, Float:y2, Float:Distance, Message[128], Payment, Bonus, NumMembers, Name[24], BonusMsg[128];
NumMembers = Convoy_CountMembers(Convoy);
GetPlayerName(LeaderID, Name, sizeof(Name));
x1 = ALocations[APlayerData[LeaderID][JobLoc1]][LocX];
y1 = ALocations[APlayerData[LeaderID][JobLoc1]][LocY];
x2 = ALocations[APlayerData[LeaderID][JobLoc2]][LocX];
y2 = ALocations[APlayerData[LeaderID][JobLoc2]][LocY];
Distance = floatsqroot(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
Payment = floatround((Distance * ALoads[APlayerData[LeaderID][LoadID]][PayPerUnit]), floatround_floor);
if (RandomBonusMission[MissionFinished] == false)
{
if (RandomBonusMission[RandomLoad] == APlayerData[LeaderID][LoadID])
if (RandomBonusMission[RandomStartLoc] == APlayerData[LeaderID][JobLoc1])
if (RandomBonusMission[RandomEndLoc] == APlayerData[LeaderID][JobLoc2])
{
Payment = Payment * 2;
RandomBonusMission[MissionFinished] = true;
format(BonusMsg, 128, "{00BBFF}O Comboio do lнder {FFBB00}%s{00BBFF} finalizou a missгo bonus.", Name);
SendClientMessageToAll(0xFFFFFFFF, BonusMsg);
}
}
Bonus = (NumMembers * 30) + 100;
Payment = (Payment * Bonus) / 100;
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
if(antfreez[MemberID] > gettime()) return Kick(MemberID);
RewardPlayer(MemberID, Payment, 5);
APlayerData[MemberID][StatsConvoyJobs]++;
PlayerFile_Save(MemberID);
Trucker_EndJob(MemberID);
format(Message, 128, TXT_FinishedConvoy, Payment);
SendClientMessage(MemberID, 0xFFFFFFFF, Message);
if (i != 0)
TextDrawSetString(APlayerData[MemberID][MissionText], TXT_WaitingLeaderJob);
}
}
AConvoys[Convoy][LoadID] = 0;
AConvoys[Convoy][Location1] = 0;
AConvoys[Convoy][Location2] = 0;
AConvoys[Convoy][Status] = CONVOY_OPEN;
AConvoys[Convoy][ConvoyStep] = 0;
AConvoys[Convoy][TrailerModel] = 0;
AConvoys[Convoy][LeaderInformedTrailers] = false;
}
}
return 1;
}
Convoy_UpdateTextDraws(Convoy)
{
new LeaderID, MemberID, LeaderName[24], NumMembers, TextLeader[128], TextMember[128], LastMember[24], LastMemberID, Float:Distance;
LeaderID = AConvoys[Convoy][Members][0];
GetPlayerName(LeaderID, LeaderName, sizeof(LeaderName));
NumMembers = Convoy_CountMembers(Convoy);
if (NumMembers > 1)
{
LastMemberID = Convoy_GetFurthestMember(Convoy);
GetPlayerName(LastMemberID, LastMember, sizeof(LastMember));
Distance = PlayerToPlayer(LeaderID, LastMemberID);
}
else
{
format(LastMember, 24, "x");
Distance = 0.0;
}
format(TextLeader, 128, TXT_LeaderInfoBar, NumMembers, LastMember, Distance);
new fghjh[9000];
format(fghjh, 9000, "~w~Comboio ~y~%s", AConvoys[Convoy][Comboiofrase]);
TextDrawSetString(AConvoys[Convoy][FraseComboio], fghjh);
TextDrawShowForPlayer(LeaderID, AConvoys[Convoy][FraseComboio]);
TextDrawSetString(AConvoys[Convoy][ConvoyTextLeader], TextLeader);
TextDrawShowForPlayer(LeaderID, AConvoys[Convoy][ConvoyTextLeader]);
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
Distance = PlayerToPlayer(LeaderID, MemberID);
format(TextMember, 128, TXT_MemberInfoBar, LeaderName, Distance, NumMembers);
TextDrawSetString(AConvoys[Convoy][ConvoyTextMember], TextMember);
TextDrawShowForPlayer(MemberID, AConvoys[Convoy][ConvoyTextMember]);
TextDrawSetString(AConvoys[Convoy][FraseComboio], fghjh);
TextDrawShowForPlayer(MemberID, AConvoys[Convoy][FraseComboio]);
}
}
}
Convoy_CountMembers(Convoy)
{
new NumMembers;
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
if (AConvoys[Convoy][Members][i] != -1)
NumMembers++;
}
return NumMembers;
}
Convoy_PlayerAllowed(playerid)
{
if (APlayerData[playerid][PlayerClass] == ClassTruckDriver)
{
if (APlayerData[playerid][InConvoy] == false)
{
if (APlayerData[playerid][JobStarted] == false)
return true;
else
SendClientMessage(playerid, 0xFFFFFFFF, TXT_CannotJoinJobStarted);
}
else
SendClientMessage(playerid, 0xFFFFFFFF, TXT_ConvoyAllreadyJoined);
}
else
SendClientMessage(playerid, 0xFFFFFFFF, TXT_ConvoyNeedsTruckerClass);
return false;
}
Convoy_SendMessage(Convoy, Message[])
{
new MemberID;
for (new i; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
SendClientMessage(MemberID, 0xFFFFFFFF, Message);
}
}
}
stock Convoy_IsLeader(playerid, Convoy)
{
if ((APlayerData[playerid][InConvoy] == true) && (AConvoys[Convoy][Members][0] = playerid))
return true;
else
return false;
}
stock Convoy_IsMember(playerid, Convoy)
{
for (new i = 1; i < CONVOY_MAX_MEMBERS; i++)
if (AConvoys[Convoy][Members][i] == playerid)
return true;
return false;
}
Convoy_GetFurthestMember(Convoy)
{
new Float:distance = 0.0, Float:distance2 = 0.0, LeaderID, MemberID, result = -1;
LeaderID = AConvoys[Convoy][Members][0];
for(new i = 1; i < CONVOY_MAX_MEMBERS; i++)
{
MemberID = AConvoys[Convoy][Members][i];
if (MemberID != -1)
{
distance2 = PlayerToPlayer(LeaderID, MemberID);
if(distance2 > distance)
{
distance = distance2;
result = MemberID;
}
}
}
return result;
}
PlayerToPlayer(player1, player2)
{
new Float:pX, Float:pY, Float:pZ, Float:cX, Float:cY, Float:cZ, Float:distance;
GetPlayerPos(player1, pX, pY, pZ);
GetPlayerPos(player2, cX, cY, cZ);
distance = floatsqroot(floatpower(floatabs(floatsub(cX, pX)), 2) + floatpower(floatabs(floatsub(cY, pY)), 2) + floatpower(floatabs(floatsub(cZ, pZ)), 2));
return floatround(distance);
}


