So ist es ![]()
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
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:
Code
Alles anzeigenUpdateHouse(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; }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
Code
Alles 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; } -
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
Code
Alles 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.
Code
Alles anzeigenUpdateHouse(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; } -
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; } -
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:
Code
Alles 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... */ } -
Alles anzeigen
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:
Code
Alles 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....?
-
Indem du Modulo rechnest. Zahl % 10 = 0 wenn diese ein vielfaches von 10 ist.
Das schließ auch die 0 mit ein.
-
Moin wie kann ich abfragen
Ob ein Wert immer zb einen vollen 10er Wert also quasi 10..20..30....?
Würde mich auch mal sehr interessieren..
-
Indem du Modulo rechnest. Zahl % 10 = 0 wenn diese ein vielfaches von 10 ist.
Das schließ auch die 0 mit ein.
Danke erstmal wie würde eine einfache if Abfrage dann genau aussehen?
