Ja, das ist ein Checkpoint.
Nicht direkt, das ist nativ in gta, das vor allen Stadien.
Aber n Pickup kann man dafür verwenden, dass das so ähnlich aussieht
Ja, das ist ein Checkpoint.
Nicht direkt, das ist nativ in gta, das vor allen Stadien.
Aber n Pickup kann man dafür verwenden, dass das so ähnlich aussieht
Ja, ist mir klar.
Aber lese grade, es geht ums Löschen.
finde diesen kreis einfach nicht im script um den zu löschen da es keine funktion mehr hat und auch nie wieder ein haben soll
Den kannst du nicht löschen, da er, wie Kaliber auch angemerkt hat, direkt im System existiert aber keine Funktion hat. Am besten du setzt den Pfeil dahinter direkt in den Checkpoint rein, dann sieht es so aus, als sollte es so sein.
Ja, ist mir klar.
Aber lese grade, es geht ums Löschen.
Den kannst du nicht löschen, da er, wie Kaliber auch angemerkt hat, direkt im System existiert aber keine Funktion hat. Am besten du setzt den Pfeil dahinter direkt in den Checkpoint rein, dann sieht es so aus, als sollte es so sein.
aso gehört also fest zu gta und wurde in sa-mp client nie mit raus genommen daher hat man die aus den singeplayer drin richtig ?
So ist es
Schade, denoch danke für eure antworten.
Nabend,
ich habe ein kleines Problem an dem ich irgendwie verzweifle.
Bei meiner Haus Update funktion wird auf biegen und brechen das Pickup nicht geupdatet beim start wird es zum richtigen Status erstellt allerdings wenn es geupdatet wird bleibt es so.
Sonst funktioniert alles Mapicon und Text werden richtig geupdatet.
Vielen dank Schonmal im Vorraus
Funktion:
UpdateHouse(id)
{
print("============================");
printf("GeupdateteID: %i DBID: %i",id,hInfo[id][h_dbid]);
new string[384];
if(hInfo[id][h_mapicon] != 0)
{
printf("HausID: %i Mapiconalt:%i",id,hInfo[id][h_mapicon]);
DestroyDynamicMapIcon(hInfo[id][h_mapicon]);
}
if(hInfo[id][h_pickup] != 0)
{
printf("HausID: %i Pickupalt:%i",id,hInfo[id][h_pickup]);
DestroyDynamicPickup(hInfo[id][h_pickup]);
}
DestroyDynamic3DTextLabel(hInfo[id][h_text]);
if(strlen(hInfo[id][h_owner]))
{
hInfo[id][h_pickup] = CreateDynamicPickup(1272,0,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]-0.25,-1);
printf("HausID: %i PickupNeu:%i",id,hInfo[id][h_pickup]);
format(string,sizeof(string),"{FFFFFF}Diese Immobilie gehört:\n{FF9FBB}%s\n{FFFFFF}Hausnr: {FF9FBB}%i",hInfo[id][h_owner],hInfo[id][h_dbid]);
hInfo[id][h_text] = CreateDynamic3DTextLabel(string, 0x008080FF,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]+0.25,10,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,STREAMER_3D_TEXT_LABEL_SD,STREAMER_TAG_AREA:-1,0);
hInfo[id][h_mapicon] = CreateDynamicMapIcon(hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz],32,0,-1,-1,-1,50,MAPICON_GLOBAL,-1,0);
}
if(!strlen(hInfo[id][h_owner]))
{
hInfo[id][h_pickup] = CreateDynamicPickup(19470,0,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]-1,-1);
printf("HausID: %i PickupNeu:%i",id,hInfo[id][h_pickup]);
format(string,sizeof(string),"{FFFFFF}Diese Immobilie steht zum Verkauf\n{FF9FBB}Kaufpreis: {FFFFFF}%i{FF0000}$\n{FF9FBB}Hausnr: {FFFFFF}%i\n{FF9FBB}~{FFFFFF}/buyhouse{FF9FBB}~",hInfo[id][h_price],hInfo[id][h_dbid]);
hInfo[id][h_text] = CreateDynamic3DTextLabel(string, 0x008080FF,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]+0.25,10,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,STREAMER_3D_TEXT_LABEL_SD,STREAMER_TAG_AREA:-1,0);
hInfo[id][h_mapicon] = CreateDynamicMapIcon(hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz],31,0,-1,-1,-1,50,MAPICON_GLOBAL,-1,0);
}
printf("HausID: %i PICKUPD: %i ",id,hInfo[id][h_pickup]);
printf("HausID: %i Text: %s ",id,string);
printf("HausID: %i Mapicon: %i ",id,hInfo[id][h_mapicon]);
print("============================");
return 1;
}
Alles anzeigen
Und hier einmal die Prints
Beim Start:
Und einmal beim Updaten hauskauf oder verkauf:
Kannst du uns den Update Befehl auch zeigen?
Ist doch eingefügt im der Code
Ist doch eingefügt im der Code
Ne, das ist nur die Funktion vom UpdateHouse, aber nicht der Befehl, der darum herum gebaut ist, wenn du es z.B. kaufst oder verkaufst
Lange Rede kurzer Sinn, pack die Funktion mal jeweils ganz ans Ende deiner Befehle und probiere es erneut
Ne, das ist nur die Funktion vom UpdateHouse, aber nicht der Befehl, der darum herum gebaut ist, wenn du es z.B. kaufst oder verkaufst
Lange Rede kurzer Sinn, pack die Funktion mal jeweils ganz ans Ende deiner Befehle und probiere es erneut
Achso
ja hier bitte
ocmd:buyhouse(playerid,params[])
{
if(HavePlayerAnyHouse(playerid)) return SendClientMessage(playerid,-1,"Du besitzt bereits ein Haus");
for(new i=0; i<sizeof(hInfo); i++)
{
if(!hInfo[i][h_dbid]) continue;
if(!IsPlayerInRangeOfPoint(playerid,5,hInfo[i][h_outx],hInfo[i][h_outy],hInfo[i][h_outz])) continue;
if(!strlen(hInfo[i][h_owner]))
{
if(GetPlayerCash(playerid) < hInfo[i][h_price]) return SendClientMessage(playerid,-1,"Du hast nicht genügend Geld!");
strmid(hInfo[i][h_owner],getPlayerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
GivePlayerCash(playerid,-hInfo[i][h_price]);
saveHouse(i);
UpdateHouse(i);
return 1;
}
return SendClientMessage(playerid,-1,"Du kannst dieses Haus nicht Kaufen!");
}
return 1;
}
ocmd:sellhouse(playerid,params[])
{
for(new i=0; i<sizeof(hInfo); i++)
{
if(!hInfo[i][h_dbid]) continue;
if(!IsPlayerInRangeOfPoint(playerid,5,hInfo[i][h_outx],hInfo[i][h_outy],hInfo[i][h_outz])) continue;
if(!strlen(hInfo[i][h_owner]))continue;
if(!strcmp(hInfo[i][h_owner],getPlayerName(playerid),true))
{
strmid(hInfo[i][h_owner],"",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
GivePlayerCash(playerid,hInfo[i][h_price]/2);
saveHouse(i);
UpdateHouse(i);
SendClientMessage(playerid,-1,"Haus erfolgreich verkauft");
return 1;
}
}
return 1;
}
Alles anzeigen
Gibt es eine möglichkeit, alle Tore mit einen Timer über einen Public wieder schlissen zu lassen, oder über ein stock.
Derzeit habe ich es immer so mit Tore gehabt, da es die einfachste veriante war.
Mit Alle Tore meinst du? :
Du möchtest, jedes Tor was du z. B. /tor öffnest, sich nach X Sekunden wieder selbstständig schließt?
Mit Alle Tore meinst du? :
Du möchtest, jedes Tor was du z. B. /tor öffnest, sich nach X Sekunden wieder selbstständig schließt?
ja, und habe derzeit bei jedem tor ein public für das schlissen nach ablauf vom timer und das wollte ich gerne aber zb nur mit ein public oder stock machen so das alle tor sich immer auf ein public wieder schlissen sprich ein public immer nur aufgerufen wird wo es sich wieder schlisst zb alle tore in ein poublic für close
Achso
ja hier bitte
CodeAlles anzeigenocmd:buyhouse(playerid,params[]) { if(HavePlayerAnyHouse(playerid)) return SendClientMessage(playerid,-1,"Du besitzt bereits ein Haus"); for(new i=0; i<sizeof(hInfo); i++) { if(!hInfo[i][h_dbid]) continue; if(!IsPlayerInRangeOfPoint(playerid,5,hInfo[i][h_outx],hInfo[i][h_outy],hInfo[i][h_outz])) continue; if(!strlen(hInfo[i][h_owner])) { if(GetPlayerCash(playerid) < hInfo[i][h_price]) return SendClientMessage(playerid,-1,"Du hast nicht genügend Geld!"); strmid(hInfo[i][h_owner],getPlayerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME); GivePlayerCash(playerid,-hInfo[i][h_price]); saveHouse(i); UpdateHouse(i); return 1; } return SendClientMessage(playerid,-1,"Du kannst dieses Haus nicht Kaufen!"); } return 1; } ocmd:sellhouse(playerid,params[]) { for(new i=0; i<sizeof(hInfo); i++) { if(!hInfo[i][h_dbid]) continue; if(!IsPlayerInRangeOfPoint(playerid,5,hInfo[i][h_outx],hInfo[i][h_outy],hInfo[i][h_outz])) continue; if(!strlen(hInfo[i][h_owner]))continue; if(!strcmp(hInfo[i][h_owner],getPlayerName(playerid),true)) { strmid(hInfo[i][h_owner],"",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME); GivePlayerCash(playerid,hInfo[i][h_price]/2); saveHouse(i); UpdateHouse(i); SendClientMessage(playerid,-1,"Haus erfolgreich verkauft"); return 1; } } return 1; }
Moin nochmal ich habe meine Funktion jetzt mal bisschen angepasst es funktionert jetzt so wie gewollt aber nur wenn man es als erstes beim letzten erstellten haus macht sobald man zu einem vorher erstellten geht ist der alte fehler da er erstellt ein pickup für das gekaufte haus löscht dieses auch aber er löscht das was beim serverstart erstellt wurde nicht. und danach funktioniert es nur noch so.
UpdateHouse(id)
{
new oldpickup;
print("============================");
printf("GeupdateteID: %i DBID: %i",id,hInfo[id][h_dbid]);
new string[384];
if(hInfo[id][h_mapicon] != -1)
{
printf("HausID: %i Mapiconalt:%i",id,hInfo[id][h_mapicon]);
DestroyDynamicMapIcon(hInfo[id][h_mapicon]);
}
if(hInfo[id][h_pickup] != -1)
{
printf("HausID: %i Pickupalt:%i",id,hInfo[id][h_pickup]);
oldpickup = hInfo[id][h_pickup];
}
DestroyDynamic3DTextLabel(hInfo[id][h_text]);
if(strlen(hInfo[id][h_owner]))
{
hInfo[id][h_pickup] = CreateDynamicPickup(1272,0,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]-0.25,-1);
format(string,sizeof(string),"{FFFFFF}Diese Immobilie gehört:\n{FF9FBB}%s\n{FFFFFF}Hausnr: {FF9FBB}%i",hInfo[id][h_owner],hInfo[id][h_dbid]);
hInfo[id][h_text] = CreateDynamic3DTextLabel(string, 0x008080FF,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]+0.25,10,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,STREAMER_3D_TEXT_LABEL_SD,STREAMER_TAG_AREA:-1,0);
hInfo[id][h_mapicon] = CreateDynamicMapIcon(hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz],32,0,-1,-1,-1,50,MAPICON_GLOBAL,-1,0);
}
if(!strlen(hInfo[id][h_owner]))
{
hInfo[id][h_pickup] = CreateDynamicPickup(19470,0,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]-1,-1);
format(string,sizeof(string),"{FFFFFF}Diese Immobilie steht zum Verkauf\n{FF9FBB}Kaufpreis: {FFFFFF}%i{FF0000}$\n{FF9FBB}Hausnr: {FFFFFF}%i\n{FF9FBB}~{FFFFFF}/buyhouse{FF9FBB}~",hInfo[id][h_price],hInfo[id][h_dbid]);
hInfo[id][h_text] = CreateDynamic3DTextLabel(string, 0x008080FF,hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz]+0.25,10,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,-1,-1,-1,STREAMER_3D_TEXT_LABEL_SD,STREAMER_TAG_AREA:-1,0);
hInfo[id][h_mapicon] = CreateDynamicMapIcon(hInfo[id][h_outx],hInfo[id][h_outy],hInfo[id][h_outz],31,0,-1,-1,-1,50,MAPICON_GLOBAL,-1,0);
}
printf("HausID: %i PickupNeu:%i",id,hInfo[id][h_pickup]);
printf("HausID: %i Text: %s ",id,string);
printf("HausID: %i Mapicon: %i ",id,hInfo[id][h_mapicon]);
print("============================");
saveHouse(id);
DestroyDynamicPickup(oldpickup);
return 1;
}
Alles anzeigen
Moin, ich erstelle ein Account, wenn ich dann Disconnecte werden einfach irgendwelche Daten in die Datenbank eingetragen. Die werden aber erst beim Disconnecten eingetragen, nach dem registrieren sind die auf 0
stock SaveUserStats(playerid)
{
if(!PlayerInfo[playerid][pLoggedIn]) return 1;
new query[256];
mysql_format(handle, query, sizeof(query), "UPDATE accounts SET level = '%d', money = '%d', kills = '%d', deaths = '%d', admin = '%d', ip = '%i' WHERE id = '%d'",
PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pIp], PlayerInfo[playerid][p_id]);
mysql_pquery(handle, query);
return 1;
}
Moin, ich erstelle ein Account, wenn ich dann Disconnecte werden einfach irgendwelche Daten in die Datenbank eingetragen. Die werden aber erst beim Disconnecten eingetragen, nach dem registrieren sind die auf 0
Codestock SaveUserStats(playerid) { if(!PlayerInfo[playerid][pLoggedIn]) return 1; new query[256]; mysql_format(handle, query, sizeof(query), "UPDATE accounts SET level = '%d', money = '%d', kills = '%d', deaths = '%d', admin = '%d', ip = '%i' WHERE id = '%d'", PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pIp], PlayerInfo[playerid][p_id]); mysql_pquery(handle, query); return 1; }
Erhöhe mal deine query auf 1000 oder so
Hat leider nichts gebracht
//edit: Fehler behoben
ja, und habe derzeit bei jedem tor ein public für das schlissen nach ablauf vom timer und das wollte ich gerne aber zb nur mit ein public oder stock machen so das alle tor sich immer auf ein public wieder schlissen sprich ein public immer nur aufgerufen wird wo es sich wieder schlisst zb alle tore in ein poublic für close
Ich bin leicht von deiner Verwendung von Stocks, Publics u. Funktionen allgemein verwirrt.
Verwende publics nur falls diese Funktion ein Callback ist (also eine Funktion die vom "Server" und nicht dem Skript direkt aufgerufen wird), eine Stock für Funktionen die du nicht unbedingt verwenden musst aber du die Fehler untedrücken magst (das du diese nicht aufrufst).
Ansonsten lasse das initilaiserungs Keyword weg.
Aber zu deiner Frage nun:
https://team.sa-mp.com/wiki/SetTimerEx.html ist denke ich was du suchst, du kannst somit deiner Funktion einen Parameter übergeben. Hier ein kleines Beispiel:
SetTimerEx("CloseGate", 5000, false, "i", 1); // schließt tor "1"
SetTimerEx("CloseGate", 5000, false, "i", 2); // schließt tor "2"
forward CloseGate(const gateid);
public CloseGate(const gateid)
{
switch(gateid)
{
case 1:
// MoveObject... für das Tor 1, bei vielen würde eine Array mit den Object ID's und den Offsets mehr sinn ergeben (also: gateids[gateid], gateoffsets[gateid][0]... usw)
break;
case 2:
// MoveObject... für das Tor 2, bei vielen würde eine Array mit den Object ID's und den Offsets mehr sinn ergeben (also: gateids[gateid], gateoffsets[gateid][0]... usw)
break;
}
/*
Oder halt
if(gateid == 1)
{
// MoveObject... für das Tor 2, bei vielen würde eine Array mit den Object ID's und den Offsets mehr sinn ergeben (also: gateids[gateid], gateoffsets[gateid][0]... usw)
}
// else...
*/
}
Alles anzeigen
Alles anzeigenIch bin leicht von deiner Verwendung von Stocks, Publics u. Funktionen allgemein verwirrt.
Verwende publics nur falls diese Funktion ein Callback ist (also eine Funktion die vom "Server" und nicht dem Skript direkt aufgerufen wird), eine Stock für Funktionen die du nicht unbedingt verwenden musst aber du die Fehler untedrücken magst (das du diese nicht aufrufst).
Ansonsten lasse das initilaiserungs Keyword weg.
Aber zu deiner Frage nun:
https://team.sa-mp.com/wiki/SetTimerEx.html ist denke ich was du suchst, du kannst somit deiner Funktion einen Parameter übergeben. Hier ein kleines Beispiel:
CodeAlles anzeigenSetTimerEx("CloseGate", 5000, false, "i", 1); // schließt tor "1" SetTimerEx("CloseGate", 5000, false, "i", 2); // schließt tor "2" forward CloseGate(const gateid); public CloseGate(const gateid) { switch(gateid) { case 1: // MoveObject... für das Tor 1, bei vielen würde eine Array mit den Object ID's und den Offsets mehr sinn ergeben (also: gateids[gateid], gateoffsets[gateid][0]... usw) break; case 2: // MoveObject... für das Tor 2, bei vielen würde eine Array mit den Object ID's und den Offsets mehr sinn ergeben (also: gateids[gateid], gateoffsets[gateid][0]... usw) break; } /* Oder halt if(gateid == 1) { // MoveObject... für das Tor 2, bei vielen würde eine Array mit den Object ID's und den Offsets mehr sinn ergeben (also: gateids[gateid], gateoffsets[gateid][0]... usw) } // else... */ }
Naja daran verwirrt ist da nix
hab sonst immer halt neues public gemacht für jedes tor
zb
pdtor1close
pdtor2close
usw daher wollte ich es nun in einen public oder stock haben ich werds mal testen danke dir
Moin wie kann ich abfragen
Ob ein Wert immer zb einen vollen 10er Wert also quasi 10..20..30....?