26.02.2014, 22:09
EDIT:
Just so you know my code is pretty simple.
When a player starts to edit an object it will start a timer to detect surfing. It's pretty simple. There is 2 timers.
The first timer will get player position 1 and object position 1 and distance from object
The second timer will get player position 2 and object position 2 and distance from object
If the player has moved and the object has moved and the distance between them is the same it will cancel the editing for the player.
PROBLEM: The object as I stated above does not update quickly enough. If I move the object really slowly it will work. If I move it fast it does not work because the object does not update as quick as it needs to.
It also gets stuck aswell if I move the object too fast it doesn't update the position. Really annoying. I'm sure this must be the update speed? Or the tickrate or something? I just don't know how to change it.
Just so you know my code is pretty simple.
When a player starts to edit an object it will start a timer to detect surfing. It's pretty simple. There is 2 timers.
The first timer will get player position 1 and object position 1 and distance from object
The second timer will get player position 2 and object position 2 and distance from object
If the player has moved and the object has moved and the distance between them is the same it will cancel the editing for the player.
PROBLEM: The object as I stated above does not update quickly enough. If I move the object really slowly it will work. If I move it fast it does not work because the object does not update as quick as it needs to.
pawn Код:
new SurfObject[MAX_PLAYERS];
new Float:FirstPosX[MAX_PLAYERS],Float:FirstPosY[MAX_PLAYERS],Float:FirstPosZ[MAX_PLAYERS];
new Float:FirstOPosX[MAX_PLAYERS],Float:FirstOPosY[MAX_PLAYERS],Float:FirstOPosZ[MAX_PLAYERS];
new Float:FirstDistance[MAX_PLAYERS];
new Float:SecondPosX[MAX_PLAYERS],Float:SecondPosY[MAX_PLAYERS],Float:SecondPosZ[MAX_PLAYERS];
new Float:SecondOPosX[MAX_PLAYERS],Float:SecondOPosY[MAX_PLAYERS],Float:SecondOPosZ[MAX_PLAYERS];
new Float:SecondDistance[MAX_PLAYERS];
new SurfDetect[MAX_PLAYERS];
new SurfDetect2[MAX_PLAYERS];
new SurfDetectActive[MAX_PLAYERS];
pawn Код:
public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
if(!IsValidDynamicObject(objectid)) return 0;
MoveDynamicObject(objectid, x, y, z, 10000000, rx, ry, rz);
if(SurfDetectActive[playerid] == 0)
{
SurfObject[playerid] = objectid;
SurfDetect[playerid] = SetTimerEx("FirstSurfCheck", 1000, false, "i", playerid);
SurfDetectActive[playerid] = 1;
SendClientMessage(playerid, COLOR_YELLOW, "Edit has activated timer 1");
}
if(response == EDIT_RESPONSE_FINAL)
{
for(new i; i < sizeof(ObjectInfo); i++)
{
if(ObjectInfo[i][oCreated] == 0 && EditingObject[playerid] == -1)
{
new string[128];
ObjectInfo[i][oVW] = GetPlayerVirtualWorld(playerid);
ObjectInfo[i][oINT] = GetPlayerInterior(playerid);
ObjectInfo[i][oX] = x;
ObjectInfo[i][oY] = y;
ObjectInfo[i][oZ] = z;
ObjectInfo[i][oRX] = rx;
ObjectInfo[i][oRY] = ry;
ObjectInfo[i][oRZ] = rz;
ObjectInfo[i][oCreated] = 1;
SaveObjects();
format(string, sizeof(string), "[OBJECT CREATE] ID %d | Name %s | SAVED", i, ObjectInfo[i][oName]);
SendClientMessage(playerid, COLOR_ORANGE, string);
DestroyDynamicObject(ObjectInfo[i][oObject]);
ObjectInfo[i][oObject] = AddDynamicObject(ObjectInfo[i][oModel],ObjectInfo[i][oX],ObjectInfo[i][oY],ObjectInfo[i][oZ],ObjectInfo[i][oRX],ObjectInfo[i][oRY],ObjectInfo[i][oRZ],ObjectInfo[i][oVW],ObjectInfo[i][oINT], -1, 200.0);
if(ObjectInfo[i][oChair] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $400 for the chair");
GivePlayerCash(playerid, -400);
}
if(ObjectInfo[i][oBed] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $450 for the bed");
GivePlayerCash(playerid, -450);
}
if(ObjectInfo[i][oTable] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $150 for the table");
GivePlayerCash(playerid, -150);
}
if(ObjectInfo[i][oElectronic] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $500 for the electronics");
GivePlayerCash(playerid, -500);
}
if(ObjectInfo[i][oCabinet] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $250 for the cabinet");
GivePlayerCash(playerid, -250);
}
if(ObjectInfo[i][oKitchen] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $300 for the kitchen furniture");
GivePlayerCash(playerid, -300);
}
if(ObjectInfo[i][oPicture] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $80 for the picture");
GivePlayerCash(playerid, -80);
}
if(ObjectInfo[i][oDoor] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $200 for the door");
GivePlayerCash(playerid, -200);
}
if(ObjectInfo[i][oSafe] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $2000 for the safe");
GivePlayerCash(playerid, -2000);
}
if(ObjectInfo[i][oBath] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "You were charged $250 for the bathroom furniture");
GivePlayerCash(playerid, -250);
}
EditMode[playerid] = 0;
SurfObject[playerid] = 0;
SurfDetectActive[playerid] = 0;
KillTimer(SurfDetect[playerid]);
KillTimer(SurfDetect2[playerid]);
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
return 1;
}
if(ObjectInfo[i][oCreated] == 1 && EditingObject[playerid] == i)
{
new string[128];
ObjectInfo[i][oVW] = GetPlayerVirtualWorld(playerid);
ObjectInfo[i][oINT] = GetPlayerInterior(playerid);
ObjectInfo[i][oX] = x;
ObjectInfo[i][oY] = y;
ObjectInfo[i][oZ] = z;
ObjectInfo[i][oRX] = rx;
ObjectInfo[i][oRY] = ry;
ObjectInfo[i][oRZ] = rz;
ObjectInfo[i][oCreated] = 1;
SaveObjects();
format(string, sizeof(string), "[OBJECT EDIT] ID %d | Name %s | SAVED", i, ObjectInfo[i][oName]);
SendClientMessage(playerid, COLOR_ORANGE, string);
DestroyDynamicObject(ObjectInfo[i][oObject]);
ObjectInfo[i][oObject] = AddDynamicObject(ObjectInfo[i][oModel],ObjectInfo[i][oX],ObjectInfo[i][oY],ObjectInfo[i][oZ],ObjectInfo[i][oRX],ObjectInfo[i][oRY],ObjectInfo[i][oRZ],ObjectInfo[i][oVW],ObjectInfo[i][oINT], -1, 200.0);
EditingObject[playerid] = -1;
EditMode[playerid] = 0;
SurfObject[playerid] = 0;
SurfDetectActive[playerid] = 0;
KillTimer(SurfDetect[playerid]);
KillTimer(SurfDetect2[playerid]);
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
return 1;
}
}
}
if(response == EDIT_RESPONSE_CANCEL)
{
for(new i; i < sizeof(ObjectInfo); i++)
{
if(ObjectInfo[i][oCreated] == 0 && EditingObject[playerid] == -1)
{
DestroyDynamicObject(ObjectInfo[i][oObject]);
SendClientMessage(playerid, COLOR_ORANGE, "[OBJECT CREATE] - Cancelled");
ObjectInfo[i][oModel] = 0;
ObjectInfo[i][oObject] = 0;
ObjectInfo[i][oChair] = 0;
ObjectInfo[i][oBed] = 0;
ObjectInfo[i][oTable] = 0;
ObjectInfo[i][oElectronic] = 0;
ObjectInfo[i][oCabinet] = 0;
ObjectInfo[i][oKitchen] = 0;
ObjectInfo[i][oPicture] = 0;
ObjectInfo[i][oDoor] = 0;
ObjectInfo[i][oSafe] = 0;
strdel(ObjectInfo[i][oName], 0, 20);
EditMode[playerid] = 0;
SurfObject[playerid] = 0;
SurfDetectActive[playerid] = 0;
KillTimer(SurfDetect[playerid]);
KillTimer(SurfDetect2[playerid]);
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
return 1;
}
if(ObjectInfo[i][oCreated] == 1 && EditingObject[playerid] == i)
{
DestroyDynamicObject(ObjectInfo[i][oObject]);
ObjectInfo[i][oObject] = AddDynamicObject(ObjectInfo[i][oModel],ObjectInfo[i][oX],ObjectInfo[i][oY],ObjectInfo[i][oZ],ObjectInfo[i][oRX],ObjectInfo[i][oRY],ObjectInfo[i][oRZ],ObjectInfo[i][oVW],ObjectInfo[i][oINT], -1, 200.0);
SendClientMessage(playerid, COLOR_ORANGE, "[OBJECT EDIT] - Cancelled");
EditingObject[playerid] = -1;
EditMode[playerid] = 0;
SurfObject[playerid] = 0;
SurfDetectActive[playerid] = 0;
KillTimer(SurfDetect[playerid]);
KillTimer(SurfDetect2[playerid]);
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
return 1;
}
}
}
return true;
}
pawn Код:
forward FirstSurfCheck(playerid);
public FirstSurfCheck(playerid)
{
new string[128];
GetPlayerPos(playerid, FirstPosX[playerid], FirstPosY[playerid], FirstPosZ[playerid]);
GetDynamicObjectPos(SurfObject[playerid], FirstOPosX[playerid], FirstOPosY[playerid], FirstOPosZ[playerid]);
FirstDistance[playerid] = GetPlayerDistanceFromPoint(playerid, FirstOPosX[playerid], FirstOPosY[playerid], FirstOPosZ[playerid]);
SurfDetect2[playerid] = SetTimerEx("SecondSurfCheck", 1000, false, "i", playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Timer 1 is active");
format(string, sizeof(string), "Distance 1 = %f", FirstDistance[playerid]);
SendClientMessage(playerid, COLOR_ORANGE, string);
}
forward SecondSurfCheck(playerid);
public SecondSurfCheck(playerid)
{
new string[128];
GetPlayerPos(playerid, SecondPosX[playerid], SecondPosY[playerid], SecondPosZ[playerid]);
GetDynamicObjectPos(SurfObject[playerid], SecondOPosX[playerid], SecondOPosY[playerid], SecondOPosZ[playerid]);
SecondDistance[playerid] = GetPlayerDistanceFromPoint(playerid, SecondOPosX[playerid], SecondOPosY[playerid], SecondOPosZ[playerid]);
SendClientMessage(playerid, COLOR_YELLOW, "Timer 2 is active");
format(string, sizeof(string), "Distance 2 = %f", SecondDistance[playerid]);
SendClientMessage(playerid, COLOR_ORANGE, string);
if(SecondDistance[playerid] == FirstDistance[playerid])
{
SendClientMessage(playerid, COLOR_YELLOW, "Distances matched");
if(SecondPosX[playerid] != FirstPosX[playerid] || SecondPosY[playerid] != FirstPosY[playerid] || SecondPosZ[playerid] != FirstPosZ[playerid])
{
SendClientMessage(playerid, COLOR_YELLOW, "Player moved aswell");
if(SecondOPosX[playerid] != FirstOPosX[playerid] || SecondOPosY[playerid] != FirstOPosY[playerid] || SecondOPosZ[playerid] != FirstOPosZ[playerid])
{
GameTextForPlayer(playerid, "~r~OBJECT SURFING DETECTED", 3000, 5);
for(new i = 0; i < sizeof(HouseInfo); i++)
{
if(GetPlayerVirtualWorld(playerid) == HouseInfo[i][EnterWorld] && GetPlayerInterior(playerid) == HouseInfo[i][EnterInterior])
{
SendClientMessage(playerid, COLOR_YELLOW, "Timer 2 has detected surfing");
SetPlayerPos(playerid, HouseInfo[i][hExitX], HouseInfo[i][hExitY], HouseInfo[i][hExitZ]);
SetTimerEx("CancelEditForPlayer", 1000, false, "i", playerid);
KillTimer(SurfDetect[playerid]);
KillTimer(SurfDetect2[playerid]);
}
}
}
else
{
SendClientMessage(playerid, COLOR_YELLOW, "Timer 2 did not detect surfing");
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
SurfDetect[playerid] = SetTimerEx("FirstSurfCheck", 1000, false, "i", playerid);
}
}
else
{
SendClientMessage(playerid, COLOR_YELLOW, "Timer 2 did not detect surfing");
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
SurfDetect[playerid] = SetTimerEx("FirstSurfCheck", 1000, false, "i", playerid);
}
}
else
{
SendClientMessage(playerid, COLOR_YELLOW, "Timer 2 did not detect surfing");
FirstPosX[playerid] = 0; SecondPosX[playerid] = 0;
FirstPosY[playerid] = 0; SecondPosY[playerid] = 0;
FirstPosZ[playerid] = 0; SecondPosZ[playerid] = 0;
FirstOPosX[playerid] = 0; SecondOPosX[playerid] = 0;
FirstOPosY[playerid] = 0; SecondOPosY[playerid] = 0;
FirstOPosZ[playerid] = 0; SecondOPosZ[playerid] = 0;
FirstDistance[playerid] = 0; SecondDistance[playerid] = 0;
SurfDetect[playerid] = SetTimerEx("FirstSurfCheck", 1000, false, "i", playerid);
}
}
forward CancelEditForPlayer(playerid);
public CancelEditForPlayer(playerid)
{
SendClientMessage(playerid, COLOR_YELLOW, "Timer 2 has cancelled editing for player");
CancelEdit(playerid);
}