A
Autor
Гость
Гость
Сделал нормальную систему конвоя, когда игрок идет за конвоиром, а не телепортируется. В системе учел если кто-то из 2-ух игроков покинет сервер, а также вход конвоира в интерьер.
Ко всем new добавьте:
new convoy[MAX_PLAYERS];
new convoyTimer[MAX_PLAYERS];
В public OnPlayerConnect добавьте:
convoy[playerid] = -1;
В public OnPlayerDisconnect добавьте:
if(GetPlayerConvoy(playerid))
{
SendClientMessage(GetArrestID(playerid), -1, "Ваш конвой покинул сервер, вы свободны!");
TogglePlayerControllable(GetArrestID(playerid), 1);
ClearAnimations(GetArrestID(playerid));
ClearValue(playerid);
}
В конец мода:
forward ConvoyTimer(playerid, playerID);
public ConvoyTimer(playerid, playerID)
{
if(!IsPlayerConnected(playerID))
{
SendClientMessage(playerid, -1, "Игрок которого вы конвоировали покинул сервер!");
ClearValue(playerid);
return 1;
}
if(IsPlayerInAnyVehicle(playerID))
{
SendClientMessage(playerid, -1, "Ваш заключенный в машине, конвой остановлен!");
TogglePlayerControllable(playerID, 1);
ClearValue(playerid);
return 1;
}
if(GetPlayerVirtualWorld(playerID) != GetPlayerVirtualWorld(playerid) || GetPlayerInterior(playerID) != GetPlayerInterior(playerid))
{
new Float:xp, Float:yp, Float:zp, Float:ap;
GetPlayerPos(playerid, xp,yp,zp);
GetPlayerFacingAngle(playerid, ap);
SetPlayerPos(playerID, xp,yp,zp);
SetPlayerInterior(playerID, GetPlayerInterior(playerid));
SetPlayerVirtualWorld(playerID, GetPlayerVirtualWorld(playerid));
TogglePlayerControllable(playerID, 0);
return 1;
}
new Float:dis = GetDistancePlayer(playerID, playerid);
if(dis < 0.95)
{
TogglePlayerControllable(playerID, 0);
TurnPlayerFaceToPlayer(playerID, playerid);
}
else if(dis > 10.0)
{
SendClientMessage(playerID, -1, "Ваш конвой ушел слишком далеко, вы свободны!");
SendClientMessage(playerid, -1, "Вы ушли слишком далеко, конвой отпущен!");
TogglePlayerControllable(playerID, 1);
ClearAnimations(playerID);
ClearValue(playerid);
}
else
{
TogglePlayerControllable(playerID, 1);
TurnPlayerFaceToPlayer(playerID, playerid);
ApplyAnimation(playerID,"ped","WALK_civi",6.0,1,1,1,1,0,1);
}
return 1;
}
stock GetPlayerConvoy(playerid)
{
return (convoy[playerid] > -1) ? 1 : 0;
}
stock GetArrestID(playerid)
{
return (convoy[playerid] > -1) ? convoy[playerid] : -1;
}
stock ClearValue(playerid)
{
KillTimer(convoyTimer[playerid]);
convoy[playerid] = -1;
}
Команды (dc_cmd + sscanf):
CMD:convoyoff(playerid, params[])
{
if(!GetPlayerConvoy(playerid))
return SendClientMessage(playerid, -1, "Вы никого не конвоируете!");
new playerID = GetArrestID(playerid);
SendClientMessage(playerID, -1, "Ваш конвоир вас отпустил, вы свободны!");
SendClientMessage(playerid, -1, "Вы отпутили конвой!");
TogglePlayerControllable(playerID, 1);
ClearAnimations(playerID);
ClearValue(playerid);
return 1;
}
CMD:convoy(playerid, params[])
{
new playerID;
if(sscanf(params,"i",playerID))
return SendClientMessage(playerid, -1, "ИНФО: /convoy [ид игрока]");
if(!IsPlayerConnected(playerid))
return SendClientMessage(playerid, -1, "Этот игрок оффлайн!");
if(playerID == playerid)
return SendClientMessage(playerid, -1, "Вы указали свой ID");
if(IsPlayerInAnyVehicle(playerid))
return SendClientMessage(playerid, -1, "Вы не можете вести конвой с машины!");
if(IsPlayerInAnyVehicle(playerID))
return SendClientMessage(playerid, -1, "Вы не можете взять под конвой когда игрок в машине!");
if(GetDistancePlayer(playerid, playerID) > 1.5)
return SendClientMessage(playerid, -1, "Игрок далеко!");
new player[MAX_PLAYER_NAME], giveplayer[MAX_PLAYER_NAME], s[144];
GetPlayerName(playerid, player, sizeof(player));
GetPlayerName(playerID, giveplayer, sizeof(giveplayer));
convoyTimer[playerid] = SetTimerEx("ConvoyTimer", 1000, true, "ii", playerid, playerID);
convoy[playerid] = playerID;
format(s,sizeof(s),"Вы установили конвой за %s", giveplayer);
SendClientMessage(playerid, -1, s);
format(s,sizeof(s),"%s установил за вами конвой", player);
SendClientMessage(playerID, -1, s);
return 1;
}
Ко всем new добавьте:
new convoy[MAX_PLAYERS];
new convoyTimer[MAX_PLAYERS];
В public OnPlayerConnect добавьте:
convoy[playerid] = -1;
В public OnPlayerDisconnect добавьте:
if(GetPlayerConvoy(playerid))
{
SendClientMessage(GetArrestID(playerid), -1, "Ваш конвой покинул сервер, вы свободны!");
TogglePlayerControllable(GetArrestID(playerid), 1);
ClearAnimations(GetArrestID(playerid));
ClearValue(playerid);
}
В конец мода:
forward ConvoyTimer(playerid, playerID);
public ConvoyTimer(playerid, playerID)
{
if(!IsPlayerConnected(playerID))
{
SendClientMessage(playerid, -1, "Игрок которого вы конвоировали покинул сервер!");
ClearValue(playerid);
return 1;
}
if(IsPlayerInAnyVehicle(playerID))
{
SendClientMessage(playerid, -1, "Ваш заключенный в машине, конвой остановлен!");
TogglePlayerControllable(playerID, 1);
ClearValue(playerid);
return 1;
}
if(GetPlayerVirtualWorld(playerID) != GetPlayerVirtualWorld(playerid) || GetPlayerInterior(playerID) != GetPlayerInterior(playerid))
{
new Float:xp, Float:yp, Float:zp, Float:ap;
GetPlayerPos(playerid, xp,yp,zp);
GetPlayerFacingAngle(playerid, ap);
SetPlayerPos(playerID, xp,yp,zp);
SetPlayerInterior(playerID, GetPlayerInterior(playerid));
SetPlayerVirtualWorld(playerID, GetPlayerVirtualWorld(playerid));
TogglePlayerControllable(playerID, 0);
return 1;
}
new Float:dis = GetDistancePlayer(playerID, playerid);
if(dis < 0.95)
{
TogglePlayerControllable(playerID, 0);
TurnPlayerFaceToPlayer(playerID, playerid);
}
else if(dis > 10.0)
{
SendClientMessage(playerID, -1, "Ваш конвой ушел слишком далеко, вы свободны!");
SendClientMessage(playerid, -1, "Вы ушли слишком далеко, конвой отпущен!");
TogglePlayerControllable(playerID, 1);
ClearAnimations(playerID);
ClearValue(playerid);
}
else
{
TogglePlayerControllable(playerID, 1);
TurnPlayerFaceToPlayer(playerID, playerid);
ApplyAnimation(playerID,"ped","WALK_civi",6.0,1,1,1,1,0,1);
}
return 1;
}
stock GetPlayerConvoy(playerid)
{
return (convoy[playerid] > -1) ? 1 : 0;
}
stock GetArrestID(playerid)
{
return (convoy[playerid] > -1) ? convoy[playerid] : -1;
}
stock ClearValue(playerid)
{
KillTimer(convoyTimer[playerid]);
convoy[playerid] = -1;
}
Команды (dc_cmd + sscanf):
CMD:convoyoff(playerid, params[])
{
if(!GetPlayerConvoy(playerid))
return SendClientMessage(playerid, -1, "Вы никого не конвоируете!");
new playerID = GetArrestID(playerid);
SendClientMessage(playerID, -1, "Ваш конвоир вас отпустил, вы свободны!");
SendClientMessage(playerid, -1, "Вы отпутили конвой!");
TogglePlayerControllable(playerID, 1);
ClearAnimations(playerID);
ClearValue(playerid);
return 1;
}
CMD:convoy(playerid, params[])
{
new playerID;
if(sscanf(params,"i",playerID))
return SendClientMessage(playerid, -1, "ИНФО: /convoy [ид игрока]");
if(!IsPlayerConnected(playerid))
return SendClientMessage(playerid, -1, "Этот игрок оффлайн!");
if(playerID == playerid)
return SendClientMessage(playerid, -1, "Вы указали свой ID");
if(IsPlayerInAnyVehicle(playerid))
return SendClientMessage(playerid, -1, "Вы не можете вести конвой с машины!");
if(IsPlayerInAnyVehicle(playerID))
return SendClientMessage(playerid, -1, "Вы не можете взять под конвой когда игрок в машине!");
if(GetDistancePlayer(playerid, playerID) > 1.5)
return SendClientMessage(playerid, -1, "Игрок далеко!");
new player[MAX_PLAYER_NAME], giveplayer[MAX_PLAYER_NAME], s[144];
GetPlayerName(playerid, player, sizeof(player));
GetPlayerName(playerID, giveplayer, sizeof(giveplayer));
convoyTimer[playerid] = SetTimerEx("ConvoyTimer", 1000, true, "ii", playerid, playerID);
convoy[playerid] = playerID;
format(s,sizeof(s),"Вы установили конвой за %s", giveplayer);
SendClientMessage(playerid, -1, s);
format(s,sizeof(s),"%s установил за вами конвой", player);
SendClientMessage(playerID, -1, s);
return 1;
}
Куда-нибудь в начало мода (после #define можно) добавьте:
stock Float:GetDistancePlayer(player1, player2)
{
new Float:coord[3][2];
GetPlayerPos(player1,coord[0][0],coord[1][0],coord[2][0]);
GetPlayerPos(player2,coord[0][1],coord[1][1],coord[2][1]);
return floatsqroot(floatpower(floatabs(floatsub(coord[0][1],coord[0][0])),2)
+floatpower(floatabs(floatsub(coord[1][1],coord[1][0])),2)
+floatpower(floatabs(floatsub(coord[2][1],coord[2][0])),2));
}
stock Float:GetDistancePlayer(player1, player2)
{
new Float:coord[3][2];
GetPlayerPos(player1,coord[0][0],coord[1][0],coord[2][0]);
GetPlayerPos(player2,coord[0][1],coord[1][1],coord[2][1]);
return floatsqroot(floatpower(floatabs(floatsub(coord[0][1],coord[0][0])),2)
+floatpower(floatabs(floatsub(coord[1][1],coord[1][0])),2)
+floatpower(floatabs(floatsub(coord[2][1],coord[2][0])),2));
}
Последнее редактирование: