// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT
//все PutPlayerInVehicle замените на putPlayerInVehicle
#include <a_samp>
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger){
SetPVarInt(playerid,"ac_car_id",vehicleid);
return 1;
}
public OnPlayerUpdate(playerid){
if(IsPlayerInAnyVehicle(playerid)){
if(GetPlayerVehicleID(playerid) != GetPVarInt(playerid,"ac_car_id")){
SetPVarInt(playerid,"ac_car_id",-1);
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
SetPlayerPos(playerid,x,y,z+1);
SendClientMessage(playerid,-1,"Не шали засранец!");
}
}
return 1;
}
putPlayerInVehicle(playerid,vehicle,seat){
SetPVarInt(playerid,"ac_car_id",vehicle);
PutPlayerInVehicle(playerid,vehicle,seat);
}
public OnPlayerConnect(playerid){
SetPVarInt(playerid,"ac_car_id",-1);
return 1;
}
Фигня
![]() Метод "дотолкать" веселее. На заметку: есть вид чита когда, состояние не меняется. Достаточно сесть в машину и ваша защита не работает ![]() |
Можно начать садиться в машину, но так и не сесть. Тогда для следующей машины античит не сработает.
|
Если так и не сядет, значение останется равным одному, и тогда весь дальнейший алгоритм не имеет смысла.
|
Не будет, если поставить исключение на PutPlayerInVehicle
|
new Vehicle[MAX_PLAYERS];
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
if(Vehicle[playerid])
{
Kick(playerid);
return 1;
}
Vehicle[playerid] = GetPlayerVehicleID(playerid);
}
else if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)
{
Vehicle[playerid] = 0;
}
return 1;
}
Зачем делать телепорт из тачки в тачку через OnPlayerUpdate? Можно сделать так:
pawn Code:
|
#include <a_samp>
new NewWVehicle[MAX_PLAYERS];
new WVehicle[MAX_PLAYERS];
new EnterWVehicleTime[MAX_PLAYERS];
new WVehicleDriver[MAX_VEHICLES];
forward PutPlayerInVehicleEx(playerid, vehicleid, seatid);
public PutPlayerInVehicleEx(playerid, vehicleid, seatid)
{
//Из-за пинга возможны проблемы. Нужно высадить и лишь потом посадить, если игрок уже был в другом транспорте.
NewWVehicle[playerid]=vehicleid;
EnterWVehicleTime[playerid]=0;
return PutPlayerInVehicle(playerid, vehicleid, seatid);
}
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
//---------------------- AntiQuikCarChange ------------------------
NewWVehicle[playerid]=vehicleid;
return 1;
}
public OnPlayerUpdate(playerid)
{
//---------------------- AntiQuikCarChange ------------------------
new vehicleid=GetPlayerVehicleID(playerid);
if(vehicleid == 0)WVehicle[playerid]=0; else//exit
{
if(WVehicle[playerid] == 0)//enter
{
if(NewWVehicle[playerid] != vehicleid)
{
SetVehicleVelocity(vehicleid, 0.0, 0.0, 0.0);
Kick(playerid);
return 0;
}
else
{
if(GetTickCount()-EnterWVehicleTime[playerid] < 1500)
{
SetVehicleVelocity(vehicleid, 0.0, 0.0, 0.0);
Kick(playerid);
return 0;
}
else
{
WVehicle[playerid]=vehicleid;
NewWVehicle[playerid]=0;
EnterWVehicleTime[playerid]=GetTickCount();
//---------------------- Anti AFK Bug ----------------------------
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)WVehicleDriver[vehicleid]=playerid;
}
}
}
else if(WVehicle[playerid] != vehicleid)
{
SetVehicleVelocity(vehicleid, 0.0, 0.0, 0.0);
Kick(playerid);
return 0;
}
//---------------------- Anti AFK Bug ----------------------------
if(GetPlayerState(playerid)==PLAYER_STATE_DRIVER && WVehicleDriver[vehicleid] != playerid)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
SetPlayerPos(playerid, x, y, z);
}
}
//...
return 1;
}
Можно не выпихивать игрока из машины перед использованием PutPlayerInVehicle, а просто самому вызвать OnPlayerStateChange.
|
pawn Code:
|