Admin | Дата: Пятница, 13.05.2016, 12:50 | Сообщение # 1 |
Гл.Администратор
Группа: Пользователи
Сообщений: 65
Награды: 1
Репутация: 32767
Статус: Offline
| Это урок по добавлению конвоя на сервер. Я уже видел команды тянуть за собой ну он как бы телепортирует к себе. А Здесь человек взятый под конвой будет идти следом. Ко всем new добавляем:
Код new FollowBy[MAX_PLAYERSS]; new TimerForPlayer[MAX_PLAYERSS]; Ко всем #define:
Код #define MAX_PLAYERSS 330 В public OnPlayerConnect:
Код TimerForPlayer [playerid]= MAX_PLAYERSS; FollowBy [playerid]= MAX_PLAYERSS; SetPVarInt(playerid, "TempFollowBy", -1); В public OnPlayerDeath:
Код new GotPVar = GetPVarInt(playerid, "TempFollowBy"); if(FollowBy [playerid]!= MAX_PLAYERSS) { SetPVarInt(FollowBy[playerid], "TempFollowBy", -1); KillTimer(TimerForPlayer[playerid]); SendClientMessage(FollowBy[playerid], COLOR_LIGHTBLUE, "Ваш заключенный мертв"); TimerForPlayer [playerid]= MAX_PLAYERSS; FollowBy [playerid]= MAX_PLAYERSS; } else if(GotPVar != -1) { SetPVarInt(playerid, "TempFollowBy", -1); KillTimer(TimerForPlayer[GotPVar]); SendClientMessage(FollowBy[playerid], COLOR_LIGHTBLUE, "Ваш конвой мертв."); TimerForPlayer [GotPVar]= MAX_PLAYERSS; FollowBy [GotPVar]= MAX_PLAYERSS; } В public OnPlayerSpawn:
Код new GotPVar = GetPVarInt(playerid, "TempFollowBy"); if(FollowBy [playerid]!= MAX_PLAYERSS) { SetPVarInt(FollowBy[playerid], "TempFollowBy", -1); KillTimer(TimerForPlayer[playerid]); SendClientMessage(FollowBy[playerid], COLOR_LIGHTBLUE, "Ваш заключенный мертв."); TimerForPlayer [playerid]= MAX_PLAYERSS; FollowBy [playerid]= MAX_PLAYERSS; }
else if(GotPVar != -1) { SetPVarInt(playerid, "TempFollowBy", -1); KillTimer(TimerForPlayer[GotPVar]); SendClientMessage(FollowBy[playerid], COLOR_LIGHTBLUE, "Ваш конвой мертв."); TimerForPlayer [GotPVar]= MAX_PLAYERSS; FollowBy [GotPVar]= MAX_PLAYERSS; } В public OnPlayerCommandText:
Код if(strcmp(cmd, "/drag", true) == 0) { new var[255]; var = strtok(cmdtext, idx); if(!strlen(var)) return SendClientMessage(playerid, 0xAA3333AA, "Вы не ввели имя игрока"); new gotplayer = strval(var); if(IsACop(playerid) || PlayerInfo[playerid] [pMember]== 3 || PlayerInfo[playerid] [pMember]== 7) { if(playerid == gotplayer) return SendClientMessage(playerid, 0xAA3333AA, "Вы не можите сопровождать самого себя "); else if(!IsPlayerConnected(gotplayer)) return SendClientMessage(playerid, 0xAA3333AA, "Такого игрока нет на сервере"); else if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xAA3333AA, "Вы не можете вести конвой с машины!"); else if(FollowBy [playerid]!= MAX_PLAYERSS) return SendClientMessage(playerid, 0xAA3333AA, "Вы не можете взять игрока под конвой, когда сами конвоируетесь!"); else if(IsPlayerInAnyVehicle(gotplayer)) return SendClientMessage(playerid, 0xAA3333AA, "Вы не можете взять под конвой когда игрок в машине!"); new Float: X, Float: Y, Float: Z; GetPlayerPos(gotplayer, X, Y, Z); if(!IsPlayerInRangeOfPoint(playerid, 1.5, X, Y, Z)) return SendClientMessage(playerid, 0xAA3333AA, "Игрок далеко от вас!"); else if(FollowBy [gotplayer]!= MAX_PLAYERSS) { //if(FollowBy [gotplayer]!= playerid) SetPVarInt(playerid, "TempFollowBy", -1); FollowBy [gotplayer]= MAX_PLAYERSS; KillTimer(TimerForPlayer[gotplayer]); TimerForPlayer [gotplayer]= MAX_PLAYERSS; ClearAnimations(playerid); TogglePlayerControllable(gotplayer, 1); SendClientMessage(playerid, 0x33AA33AA, "Вы успешно установили конвой за игроком!"); return SendClientMessage(gotplayer, 0xFFFF00AA, "С вас был снят конвой!"); } if(GetPVarInt(playerid, "TempFollowBy") != -1) return SendClientMessage(playerid, 0xAA3333AA, "Вы не можете сопровождать больше 2х игроков одновременно!"); FollowBy [gotplayer]= playerid; SetPVarInt(playerid, "TempFollowBy", gotplayer); TimerForPlayer [gotplayer]= SetTimerEx("FollowToPlayer", 1000, 1, "i", gotplayer); SendClientMessage(playerid, 0x33AA33AA, "Вы успешно начали сопровождение этого игрока!"); return SendClientMessage(gotplayer, 0xFFFF00AA, "вас взяли под конвой"); } } В конец мода вне пабликов вставить:
Код stock SetPlayerToFacePlayer(playerid, targetid) { new Float:pX, Float:pY, Float:pZ, Float:X, Float:Y, Float:Z, Float:ang; if(!IsPlayerConnected(playerid) || !IsPlayerConnected(targetid)) return 0; GetPlayerPos(targetid, X, Y, Z); GetPlayerPos(playerid, pX, pY, pZ); if( Y > pY ) ang = (-acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 90.0); else if( Y < pY && X < pX ) ang = (acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 450.0); else if( Y < pY ) ang = (acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 90.0); if(X > pX) ang = (floatabs(floatabs(ang) + 180.0)); else ang = (floatabs(ang) - 180.0); SetPlayerFacingAngle(playerid, ang); return 0; } forward FollowToPlayer(playerid); public FollowToPlayer(playerid) { static AnimShot[MAX_PLAYERSS]; if(!IsPlayerConnected(FollowBy[playerid])) { KillTimer(TimerForPlayer[playerid]); TimerForPlayer [playerid]= MAX_PLAYERSS; FollowBy [playerid]= MAX_PLAYERSS; TogglePlayerControllable(playerid, 1); ClearAnimations(playerid); AnimShot [playerid]= false; SendClientMessage(playerid, 0xFFFF00AA, "Вы свободны, конвой покинул сервер!"); return 1; } else if(!IsPlayerConnected(playerid)) { SetPVarInt(FollowBy[playerid], "TempFollowBy", -1); KillTimer(TimerForPlayer[playerid]); TimerForPlayer [playerid]= MAX_PLAYERSS; AnimShot [playerid]= false; SendClientMessage(FollowBy[playerid], 0xFFFF00AA, "Арестованный покинул сервер!"); FollowBy [playerid]= MAX_PLAYERSS; return 1; } else if(FollowBy [playerid]== MAX_PLAYERSS) { KillTimer(TimerForPlayer[playerid]); TimerForPlayer [playerid]= MAX_PLAYERSS; AnimShot [playerid]= false; SendClientMessage(playerid, 0xFFFF00AA, "С вашем конвоем произошла беда, вы свободны !"); TogglePlayerControllable(playerid, 1); ClearAnimations(playerid); return 1; } else if(IsPlayerInAnyVehicle(playerid)) { SetPVarInt(FollowBy[playerid], "TempFollowBy", -1); KillTimer(TimerForPlayer[playerid]); TimerForPlayer [playerid]= MAX_PLAYERSS; AnimShot [playerid]= false; SendClientMessage(FollowBy[playerid], 0xFFFF00AA, "Ваш заключенный в машине. Конвой остановлен"); FollowBy [playerid]= MAX_PLAYERSS; return 1; } else if(GetPlayerVirtualWorld(FollowBy[playerid]) != GetPlayerVirtualWorld(playerid) || GetPlayerInterior(FollowBy[playerid]) != GetPlayerInterior(playerid)) { new Float: X, Float: Y, Float: Z; GetPlayerPos(FollowBy[playerid], X, Y, Z); SetPlayerPos(playerid, X, Y, Z); SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(FollowBy[playerid])); SetPlayerInterior(playerid, GetPlayerInterior(FollowBy[playerid])); TogglePlayerControllable(playerid, 0); AnimShot [playerid]= false; return 1; } new Float: GotDistance = GetDistanceBetweenPlayers(playerid, FollowBy[playerid]); if(GotDistance < 0.95) { TogglePlayerControllable(playerid, 0); SetPlayerToFacePlayer(playerid, FollowBy[playerid]); AnimShot [playerid]= false; return 1; } else if(GotDistance > 10.0) { SetPVarInt(FollowBy[playerid], "TempFollowBy", -1); SendClientMessage(FollowBy[playerid], 0xFFFF00AA, "Вы ушли слишком далеко. Конвой закончен"); SendClientMessage(playerid, 0xFFFF00AA, "Ваш конвой ушел слишком далеко, вы свободны."); TogglePlayerControllable(playerid, 1); ClearAnimations(playerid); KillTimer(TimerForPlayer[playerid]); TimerForPlayer [playerid]= MAX_PLAYERSS; FollowBy [playerid]= MAX_PLAYERSS; return 1; } else { TogglePlayerControllable(playerid, 1); SetPlayerToFacePlayer(playerid, FollowBy[playerid]); ApplyAnimation(playerid, "ped", "WALK_civi", 6.0, 1, 1, 1, 1, 0, 1); } return 1; }
|
|
|
|