Ich habe das Problem an einigen Systemen, dass sich Objekte sporadisch nicht löschen lassen bzw. erstellen lassen, wenn diese Ingame erstellt werden.
Das Problem lässt sich wie folgt provozieren:
[Objekte OnGameModeInit laden] -> [/createatm - Zusätzliches Objekt erstellt] -> [/deleteatm von einem bei OnGameModeInit geladenem Objekt] -> [/createatm - Kein Automat zu sehen obwohl alle Ausgaben stimmen]
Zusätzlich gibt es selten das Problem:
[/deleteatm - Objekt wird aus der Datenbank gelöscht ist Ingame aber noch zu sehen]
Das Laden und erstellen aus der Datenbank läuft in jedem Fall Problemlos beim laden unter OnGameModeInit.
Versucht wurde mit der Streamer_Update Funktion zu arbeiten, erfolglos...
C#
//GLOBAL
enum atminfo{
db_aid,
Float:aX,
Float:aY,
Float:aZ,
Float:aR,
atmexistiert
};
#define MAX_ATM 300
new aInfo[MAX_ATM][atminfo];
new AtmObjectID[MAX_ATM];
new Text3D:AtmLabelID[MAX_ATM];
//ONGAMEMODEINT
mysql_pquery(handle,"SELECT * FROM `atm`","LoadATM");
for (new i = 0; i < MAX_ATM; ++i) {
aInfo[i][db_aid] = INVALID_ATM_ID;
}
//---------------------------------
forward LoadATM();
public LoadATM()
{
new rows;
cache_get_row_count(rows);
if(rows==0) return 1;
for(new atmid = 0; atmid < rows; atmid++)
{
if(aInfo[atmid][atmexistiert] == 1) continue;
cache_get_value_name_int(atmid,"ID",aInfo[atmid][db_aid]);
if(aInfo[atmid][db_aid] == INVALID_ATM_ID) continue;
cache_get_value_name_float(atmid,"X",aInfo[atmid][aX]);
cache_get_value_name_float(atmid,"Y",aInfo[atmid][aY]);
cache_get_value_name_float(atmid,"Z",aInfo[atmid][aZ]);
cache_get_value_name_float(atmid,"R",aInfo[atmid][aR]);
AtmLabelID[atmid] = CreateDynamic3DTextLabel("Bankautomat",GREEN,aInfo[atmid][aX],aInfo[atmid][aY],aInfo[atmid][aZ],4.0,INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0); //Objekt wird erstellt aber manchmal nicht angezeigt
AtmObjectID[atmid] = CreateDynamicObject(19324,aInfo[atmid][aX],aInfo[atmid][aY],aInfo[atmid][aZ],0.0,0.0,aInfo[atmid][aR]); //Objekt wird erstellt aber manchmal nicht angezeigt
aInfo[atmid][atmexistiert] = 1;
return 1;
}
forward OnNewATMInserted();
public OnNewATMInserted()
{
mysql_pquery(handle, "SELECT * FROM `atm`", "LoadATM");
}
forward OnATMDeleted(atmid);
public OnATMDeleted(atmid)
{
aInfo[atmid][atmexistiert] = 0;
aInfo[atmid][db_aid] = INVALID_ATM_ID;
DestroyDynamic3DTextLabel(AtmLabelID[atmid]); //Die richtige ID wird gelöscht, Objekt wird aber nicht immer gelöscht
DestroyDynamicObject(AtmObjectID[atmid]); //Die richtige ID wird gelöscht, Objekt wird aber nicht immer gelöscht
}
ocmd:createatm(playerid,params[])
{
new Float:x, Float:y, Float:z, Float:r;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, r); // Spielerrotation erhalten
new query[256];
mysql_format(handle, query, sizeof(query), "INSERT INTO atm (X, Y, Z, R) VALUES (%f, %f, %f, %f)", x, y, z, r);
mysql_pquery(handle, query, "OnNewATMInserted"); //In der Datenbank einfügen + im Callback den neuen Automaten erstellen.
return 1;
}
ocmd:deleteatm(playerid,params[])
{
new query[256];
for(new atmid = 0; atmid < MAX_ATM; atmid++)
{
if(aInfo[atmid][atmexistiert] != 1) continue;
if(IsPlayerInRangeOfPoint(playerid, 1.5, aInfo[atmid][aX], aInfo[atmid][aY], aInfo[atmid][aZ]))
{
format(query, sizeof(query), "DELETE FROM atm WHERE ID = %d", aInfo[atmid][db_aid]);
mysql_pquery(handle, query, "OnATMDeleted", "d", atmid);
return 1;
}
}
return 1;
}
Alles anzeigen