SA-MP Forums Archive
OnPlayerEditDynamicObject - Does not update object position quick enough - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: OnPlayerEditDynamicObject - Does not update object position quick enough (/showthread.php?tid=497451)



OnPlayerEditDynamicObject - Does not update object position quick enough - Phil_Cutcliffe - 26.02.2014

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.

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);
}
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.


Re: OnPlayerEditDynamicObject - Does not update object position quick enough - Crayder - 27.02.2014

Actually I dont think the player and object will be moving the SAME EXACT distance... Think about it, the object is able to be turned (causing a slide), quickly lifted (causing a jump), etc... I do understand your reasoning for this though, but maybe if the absolute value of both measurements (floatabs) and the difference (floatsub) were only off by say 1.0 meters, that will cancel the movement... Dont try an exact value...


Re: OnPlayerEditDynamicObject - Does not update object position quick enough - Phil_Cutcliffe - 27.02.2014

Quote:
Originally Posted by Crayder
Посмотреть сообщение
Actually I dont think the player and object will be moving the SAME EXACT distance... Think about it, the object is able to be turned (causing a slide), quickly lifted (causing a jump), etc... I do understand your reasoning for this though, but maybe if the absolute value of both measurements (floatabs) and the difference (floatsub) were only off by say 1.0 meters, that will cancel the movement... Dont try an exact value...
EDIT: I have cracked it! Thanks to you my brain cogs turned! It now detects it no matter how fast I move and it is 100% working I've just stress tested it to the max! So chuffed! I just simply said if seconddist >= first-1.0 && seconddist <= first+1.0 and works an absolute treat!


Re: OnPlayerEditDynamicObject - Does not update object position quick enough - Crayder - 27.02.2014

Quote:
Originally Posted by Phil_Cutcliffe
Посмотреть сообщение
EDIT: I have cracked it! Thanks to you my brain cogs turned! It now detects it no matter how fast I move and it is 100% working I've just stress tested it to the max! So chuffed! I just simply said if seconddist >= first-1.0 && seconddist <= first+1.0 and works an absolute treat!
Your welcome! Glad to know I can still help out on the forums!