Beiträge von Mogly1
-
-
-
Bau dir ein paar print's mit ein, und schau wo es endet. bei so viel Code mit Spieler Infos. wird es schwer da durch zu sehen
-
Wenn du den String, also deine Einlog versuche anzeigen willst im Titel oben dann nutze es so
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,string,"Dein Account wurde gefunden bitte Logge dich ein ","OK",""); -
Okay weil du so nett gefragt hast palwal
Wir erstellen ein Fire enum, wo wir die Position, Id, Leben und den Text speichern
ungefähr so dann.
Code
Alles anzeigen#define MAX_FIRE 500 //sind die maximalen Flamen die erstellt werden können enum fire_enum { fire_id, fire_health, Float:fire_x, Float:fire_y, Float:fire_z, Text3D:fire_3D } new fire[MAX_FIRE][fire_enum];
dann erstellen wir einfach mal ein Feuer in dem wir ein object erstllen und dort das enum mit den Daten befüllen, wir nehmen also GetPlayerPos und setzen das Leben auf 100 von dem Feuer, die id setzen wir auf das erstellte Obejct, also dann so:
(Nutze hierbei ocmd als include)
Code
Alles anzeigenocmd:createfire(playerid,params[]) { new Float:PlayerPos[3];//Speichert unsere Pos aka. X,Y,Z GetPlayerPos(playerid, PlayerPos[0],PlayerPos[1],PlayerPos[2]);//setzt unsere Werte for(new i=0; i < MAX_FIRE; i++) //geht alle Feuer, bis also MAX_FIRE was wir oben definiert haben { if(fire[i][fire_id] == 0)//Wenn unser Feuer keine id hat, erstellen wir an diesem punkt (index) ein Feuer { fire[i][fire_id]=CreateObject(18691, PlayerPos[0],PlayerPos[1],PlayerPos[2]-3, 0, 0, 0.0);//Setzen hier die fire_id zu unserer Object id fire[i][fire_x]=PlayerPos[0];//Setzen die X Koordinate fire[i][fire_y]=PlayerPos[1];//Setzen die Y Koordinate fire[i][fire_z]=PlayerPos[2];//Setzen die Z Koordinate fire[i][fire_health]=100;//Setzen das leben von dem Feuer auf 100 new string[50];//geben ein 3DTextlabel, ist aber kein muss format(string,sizeof(string),"Feuer(%d): %d%",fire[i][fire_id],fire[i][fire_health]);//formatieren den String um unser Feuer Leben azuzeigen fire[i][fire_3D]=Create3DTextLabel(string,-1,PlayerPos[0],PlayerPos[1],PlayerPos[2],10,0,0);//erstellen den 3Dtext und speichern die id unter fire_3D ab break;//brechen die schleife ab, da wir eine freie id gefunden haben(sonst würden wir ja zig flammen erstellen) } } return 1;//damit kein Fehler kommt und der Befehl existiert }
So nun haben wir ein Feuer erstellt also beim ersten Aufruf haben wir somit im index = 0 die ganzen Daten.
Nun Bauen wir einen Timer ein, da OnPlayerUpdate zu viel Ressourcen zieht(verbessert mich wenn das nicht stimmt MfG.)
Ich habe hier jetzt SetTimerEx genommen.
Diesen Timer nutzen wir um Schaden uns abzuziehen und dem Feuer wenn wir mit dem Feuerlöscher draufhalten.
Code
Alles anzeigen#define FIRE_DMG 5 #define Holding(%0) \ ((newkeys & (%0)) == (%0))//definiert das Holding new fire_timer[MAX_PLAYERS];//Damit wir den Timer auch deleten können public OnPlayerConnect(playerid) { fire_timer[playerid]=SetTimerEx("Second",1000, true, "i",playerid);//starten den Palyer Timer return 1; } public OnPlayerDisconnect(playerid, reason) { KillTimer(fire_timer[playerid]);//löschen den PlayerTimer return 1; } forward Second(playerid); public Second(playerid)//jede Sekunde wird das aufgerufen { for(new i=0; i < MAX_FIRE; i++)//gehen alle feuer durch { if(fire[i][fire_id] != 0)//Wenn das Feuer existiert gehen wir in die Bedingung rein, sonst passiert nix { if(IsPlayerInRangeOfPoint(playerid,3,fire[i][fire_x],fire[i][fire_y],fire[i][fire_z]))//Fragt ab ob wir in der reichweite vom Feuer sind (range = 3 hier) { new newkeys,l,u;//das ist aus dem was ich verlinkt habe simple gesagt fragt ab ob wir die Taste Fire aka schießen gedrückt halten. GetPlayerKeys(playerid, newkeys, l, u);//same if(Holding(KEY_FIRE))//same { if(GetPlayerWeapon(playerid) == 42)//frag ab ob wir den Feuerlöscher haben { if(PlayerFaces(playerid, fire[i][fire_x], fire[i][fire_y], fire[i][fire_z], 1))//aus dem Script was ich verlinkt habe, wenn du aufs Feuer Zielst { fire[i][fire_health]-=33;//ziehen dem Feuer dann leben ab new string[50];//Setzen den neuen Text mit dem Leben format(string,sizeof(string),"Feuer(%d): %d%",fire[i][fire_id],fire[i][fire_health]);//Setzen den neuen Text mit dem Leben Update3DTextLabelText(fire[i][fire_3D], -1, string);//updaten hier unseren Text, da er ja schon erstellt worden ist if(fire[i][fire_health] <= 0)//Wenn das Feuer kein leben mehr hat oder unter 0 fällt, wird es gelöscht dazu kommen wir gleich { DeleteFire(i);//löscht das feuer } } } } if(GetPlayerSkin(playerid) != 277 && GetPlayerSkin(playerid) != 278 && GetPlayerSkin(playerid) != 279)//Wenn man kein feuerwehr skin hat bekommt man damage { //berechnet unser neues Leben new Float:health; GetPlayerHealth(playerid,health); health=health-FIRE_DMG;//ziehen hier uns dem Definierten Feuer Dmg ab SetPlayerHealth(playerid,health); } } } } return 1; }
So nun müssen wir das Feuer noch löschen, was wir unter DeleteFire angegeben haben
Dazu setzen wir also einfach alle Daten wieder zurück
Code
Alles anzeigenstock DeleteFire(id) { DestroyObject(fire[id][fire_id]);//zerstört das Object fire[id][fire_id]=0;//Setzt id auf 0 und somit kann createFire wieder diese id nutzen fire[id][fire_x]=0;//Setzt Pos auf 0 fire[id][fire_y]=0;//Setzt Pos auf 0 fire[id][fire_z]=0;//Setzt Pos auf 0 fire[id][fire_health]=0; //leben noch mal auf 0 setzen Delete3DTextLabel(fire[id][fire_3D]);//löschen den 3DText, da wir ihn ja wieder dann erstellen mit Create return 1; }
So und hier sind noch die 2 Methoden aus dem Script, vom Link
die du benötigst für die Berechnungen(Das ist jetzt Mathe, werde da jetzt nix kommentieren c(: )
Code
Alles anzeigenFloat:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) { new Float:TGTDistance; TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ)); new Float:tmpX, Float:tmpY, Float:tmpZ; tmpX = FrX * TGTDistance + CamX; tmpY = FrY * TGTDistance + CamY; tmpZ = FrZ * TGTDistance + CamZ; return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ)); } stock PlayerFaces(playerid, Float:x, Float:y, Float:z, Float:radius) { new Float:cx,Float:cy,Float:cz,Float:fx,Float:fy,Float:fz; GetPlayerCameraPos(playerid, cx, cy, cz); GetPlayerCameraFrontVector(playerid, fx, fy, fz); return (radius >= DistanceCameraTargetToLocation(cx, cy, cz, x, y, z, fx, fy, fz)); }
Bei Fehlern oder Verbesserungen Bedanke ich mich für die Meldung .
und falls du noch vor hast mit Waffen wände zerstörbar zu machen, kannst du diese Simple Methode nutzen auch für dich evt. nützlich palwal
Code
Alles anzeigenpublic OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) { if(hittype == BULLET_HIT_TYPE_OBJECT) { new string[100]; format(string,sizeof(string),"Objectid: %d",hitid); SendClientMessage(playerid,-1,string); if(IsValidObject(hitid)) { DestroyObject(hitid); } } }
natürlich muss dann das Objekt wieder leben haben, aber das Beispiel habe ich ja jetzt gezeigt.
MfG. Mogly1
-
Hier ist ein simples System etwas älter aber, da verstehst man es recht schnell.
Feuerwehrsystem |by XYZGamerXP|
Das kannst du dann auch noch ausbauen.
Aber im Prinzipiell,
musst du ein Feuer Objekt erstellen an den Koords wo du es haben willst, dieses Object dann leben geben und dann wenn es gelöscht wird, Leben abziehen.
Und wenn das Leben auf 0 ist, Destroyst du wieder das Object.
-
@Rocky Balboa
Hier ist sein Connect_To_Database();Codestock Connect_To_Database() { #if defined Testserveran mysql_log( LOG_ALL , LOG_TYPE_HTML); #endif gSQL = mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS); //Wir versuchen mit den Angaben die wir oben im Script gemacht haben uns mit dem MySQL Server zu verbinden. mysql_oquery("SELECT 1", THREAD_CONNECTION_CHECK1 , INVALID_PLAYER_ID ,gSQL); tMySQL = SetTimer("MySQL_Connection_Check",5003,false); }
wollte hier das nur fix für alle ersichtlich machen
MfG. Mogly1
Aber hast du evt. in der Tabelle bei Admin keine Default Value?
Bzw. hilft dir der Link eventuell:
https://stackoverflow.com/ques…snt-have-a-default-values -
Also geht es jetzt?
-
Nach dem Login?
Speicherst du die Koordinaten richtig und lädst sie auch wieder?
Nicht das du nach dem Logout die Koords nicht richtig in der Db hast und somit beim Einloggen dann falsch spawnst.
(Wenn du das im Script drinne hast)Oder wei genau meinst du das mit dem durch die Map fallen.
Mfg. Mogly1
-
Hey Domse_Cross
Ich habe hier noch was auf mein Pc gefunden, da kannst du das abgleichen.
(Server mit Includes und das Tutorial Script zwar nicht das aktuellste aber die Version sollte reichen)
https://workupload.com/file/J8KEqSUS8Gv
(Falls der Link nicht geht, PN me)
MfG. Mogly1
-
Also mit den angaben von dir bin ich auf
"The Longing"gestoßen.
Youtube Videos dazu sind paar Monate her(zumindest die mir da empfohlen wurden :D)
und man kann da irgendwie Malen.
Mfg. Mogly1 -
Zitatmit coolen Features und eigenen Systemen.
Welche denn zum Beispiel?
So etwas kann jeder behaupten ^^.
MfG Mogly1.
-
Hast du bei
"OnplayerRegister"
auf groß und klein Schreibung geachtet, also das der public genaus so auch geschrieben ist?
nicht das du es im public mit einem großen P geschrieben hast also so, "OnPlayerRegister".
mfg. M1
-
Hey, weiß einer warum nichts passiert wenn ich /createclan bzw wenn ich vor einem freien Clanhaus stehe kein Clan erstellt wird?
Da Ich jetzt nicht fest stellen konnte, wann du ClanHaus[i][hActicate] setzt.
Denke Ich das du in der Zeile 5873 das ändern solltest zu ClanHaus[i][hActicate] ==1, da du sonst derzeitig alle überspringst, die Noch zu haben sind?
(Meine Vermutung, da ich nicht weiß wann du ClanHaus[i][hActicate] die variable setzt. Bsp. in OnPlayerCreateClan wird sie nämlich nicht gesetzt.)Kann aber auch falsch sein .
-
Community, super lustig.
-
Dann muss ich für denen Player einen Timer setzen oder?
Wie ressourcenhungrig ist eigentlich so ein Timer? ich brüchte ja 100Stk bei 100 Spielern. Bei SetWorldTime brauche ich nur einen (da geht die minute ja nicht?)
Nicht ganz du machst einen Globalen Timer und gehst dann mit einer for schleife durch alle Spieler die gerade auf den Server sind, somit sparst du andere Timer.
und wenn du jetzt den Timer einmal alle Minute updatest sollte das doch gehen oder? Sowie den Spielern beim Connect die Uhrzeit einmal setzen, die du einfach in einer globalen Variable speicherst und beim Timer Aufruf setzt.
Hallo,
ich habe ein Problem, dass zerstörte deklarierte Vehicles ersetzt werden durch neu erstellte. Dies ist dann ein Problem, wenn man irgendwo Vehicleid abfragen hat...
Uns ist das die Tage aufgefallen und da von uns keiner Erfahrungen damit gemacht hat frage ich mal hier
Die Ursache ist mir nicht ganz klar, ich hoffe man kann mich aufklären warum das so ist und was ich dagegen machen kann.
Mache ich das so, dann tritt dieser "Bug" auf, vertausche ich aber die 2 Zeilen, sodass ich erst das Fahrzeug erstelle und anschließend es lösche klappt es (wahrscheinlich würde es dann wieder Bugs geben mit neu erstellen Fahrzeugen danach).
CodeDestroyVehicle(Biz6Vehicle[i]); ErsetztesVehicle[playerid] = CreateVehicle(FVVehTypes1[i][FVT1Model], //...
Steige ich mit dieser Variante in das neue Fahrzeug, kommt er trotzdem durch diesen Code.
Sry wegen dem langen Zitieren aber Foren und ich ka. wie man das kürzt
Also, nach dem DestroyVehicle(BizVehicle[i]);
fügst du noch das hinzu:
CodeDestroyVehicle(Biz6Vehicle[i]); Biz6Vehicle[i] = INVALID_VEHICLE_ID; ErsetztesVehicle[playerid] = CreateVehicle(FVVehTypes1[i][FVT1Model],//
Grund, du hast ja bestimmt Biz6Vehicle[I] = CreateVeh... erstellt somit behält er die Vehicle id auch wenn du sie Destroyst, denn DestroyVehicle cleart nicht dein Biz6Vehicle[i], somit musst du danach der Variable eine Invalid id geben oder -1 setzen ist eig. egal
Somit sollte es dann gehen eig.
-
Mit,
https://wiki.sa-mp.com/wiki/SetPlayerTime
,kannst du auch die Minuten angeben. Wenn du jede Minute die zeit setzt, sollte es Smoother aussehen.
-
Schau mal in deinem Code Zeile 22 bis 25
müsste playerid nicht zu i? wie du davor auch für die if abfragen genutzt hast?
CodePlayerCar[i][slot][vehAbgeschleppt] = 1; format(PlayerCar[i][slot][vehAbgeschlepptVon], MAX_PLAYER_NAME, "%s", GetName(playerid)); PlayerCar[i][slot][vehKaution] = Geld; SavePlayerVehicle(i);
Sonst speicherst du die Daten ja nur für die playerid... könnte evt. der Fehler sein.
mfg. Mogly1
-
Also du könntest über deiner AddAuftrag Funktion, die Seite hinzufügen aber das
Problem hierbei ist, mann sieht dennoch dann 12 Items bzw. das 13 sogar als überschrift.
siehe https://wiki.sa-mp.com/wiki/AddMenuItem
Deswegen würde ich das so nicht ganz machen, du machst gerade jedes Item(Auftrag) gleich als AddMenuItem aber das wird dir bald Probleme geben.
Ich würde dir empfehlen wenn du es über so ein Menu weiter machen willst, erstelle dir gleich ein Menu mit genau 10 Items und der "Nächsten Seite".
Also so hier, das wäre ein Lösungsansatz/vorschlag von mir (mit diesem kannst du dann auch ganz einfach Items/Aufträge wieder löschen)
InGame dann so:
Code
Alles anzeigen//oben anpassen :) new Menu:teleportmenu[MAX_PLAYERS]; //----------------------- stock AddAuftrag(titel[],autor[],auftragtext[],position,Float:AuftragX,Float:AuftragY,Float:AuftragZ) // && listauftrage { new i = FindFreeAuftragID(); if(i == -1) return 0; format(Auftrag[i][a_autor],MAX_PLAYER_NAME+1,autor); format(Auftrag[i][a_description],30,titel); format(Auftrag[i][a_auftragtext],256,auftragtext); Auftrag[i][auftragid] = i; Auftrag[i][a_position] = position; new subString[148]; format(subString, sizeof(subString), "Auftrag erstellt, ID: %d, Länge: %d, Text: %s ",Auftrag[i][auftragid],strlen(Auftrag[i][a_description]),Auftrag[i][a_description]); SendClientMessageToAll(-1,subString); if(position) { Auftrag[i][a_PosX] = AuftragX; Auftrag[i][a_PosY] = AuftragY; Auftrag[i][a_PosZ] = AuftragZ; } return 1; //ListAuftrage(); }//mitgettime ocmd:auftragadden(playerid,params[]) { new titel[30],text[100],koordinaten; if(sscanf(params, "ssd", titel,text,koordinaten)) return SendClientMessage(playerid, -1, "/auftragadden [titel] [Beschreibung::MAX__100] [Koordinaten? 0 / 1]"); // AddAuftrag("Farmer","DrWho","Ich suche einen Farmer.",0,0,0,0); // Legendär AddAuftrag(titel,"Mogly",text,koordinaten,0,0,0); return 1; } ocmd:auftrage(playerid,params[]) { new subString[128],count; DialogTempIndex[playerid] = 0; DestroyMenu(teleportmenu[playerid]); teleportmenu[playerid] = CreateMenu("Auftraege", 1, 50.0, 180.0, 200.0, 200.0); for(new i=0; i<sizeof(Auftrag); i++) { if(Auftrag[i][auftragid] != -1) { if(count==10) { AddMenuItem(teleportmenu[playerid], 0,"Naeste Seite"); DialogTemp[playerid][DialogTempIndex[playerid]++] = -1; SetPVarInt(playerid,"Auftrag_Seite",1); break; } else { //SCM(playerid,-1,"Auftrag ausgeführt!"); /* format(subString, sizeof(subString), "ID: %d, Länge: %d, Text: %s ",Auftrag[i][auftragid],strlen(Auftrag[i][a_description]),Auftrag[i][a_description]); SCM(playerid,-1,subString);*/ count++; AddMenuItem(teleportmenu[playerid], 0,Auftrag[i][a_description]); DialogTemp[playerid][DialogTempIndex[playerid]++] = i; } } } if(count == 0) return SendClientMessage(playerid,-1,"Es konnte kein Auftrag gefunden werden!"); ShowMenuForPlayer(teleportmenu[playerid],playerid); return 1; } //remove auftrag? or not1 stock FindFreeAuftragID() { for(new i=0; i<sizeof(Auftrag); i++) { if(Auftrag[i][auftragid]==-1) return i; } return -1; } public OnPlayerSelectedMenuRow(playerid, row) { TogglePlayerControllable(playerid,true); new Menu:CurrentMenu = GetPlayerMenu(playerid); if(CurrentMenu == teleportmenu[playerid]) { new i = DialogTemp[playerid][row]; if(i==-1) { DialogTempIndex[playerid]=0; DestroyMenu(teleportmenu[playerid]); teleportmenu[playerid] = CreateMenu("Auftraege", 1, 50.0, 180.0, 200.0, 200.0); new count,next_count; for(new a=0; a<sizeof(Auftrag); a++) { if(Auftrag[a][auftragid]!=-1) { count++; if(count > GetPVarInt(playerid,"Auftrag_Seite")*10) { if(next_count==10) { AddMenuItem(teleportmenu[playerid], 0,"Naechste Seite"); DialogTemp[playerid][DialogTempIndex[playerid]++] = -1; SetPVarInt(playerid,"Auftrag_Seite", GetPVarInt(playerid,"Auftrag_Seite")+1); break; } next_count++; DialogTemp[playerid][DialogTempIndex[playerid]++] = a; AddMenuItem(teleportmenu[playerid], 0,Auftrag[a][a_description]); } } } ShowMenuForPlayer(teleportmenu[playerid],playerid); } else { new string[84],string2[312]; // "Aufrag von " + string wie in C format(string,sizeof(string),"Auftrag von{B40404} %s",Auftrag[i][a_autor]); format(string2,sizeof(string2),"%s %d",Auftrag[i][a_auftragtext],Auftrag[i][auftragid]); ShowPlayerDialog(playerid, DIALOG_MENU_ROW, DIALOG_STYLE_MSGBOX, string, string2, "Contact", "Go Back"); } } return 1; }
Was genau, habe ich da jetzt gemacht?
Also ich habe bei AddAuftrag dei AddMenuItems raus genommen, und bei ocmd:auftrage die abfrage das er bei count 10 den "Nächste Seite" Button hinzufügt, dieser hat die id -1 um ihn unter OnPlayerSelectedMenuRow wieder nutzen zu können. Unter OnPlayerSelectedMenuRow habe Ich somit die if abfrage == -1 hinzugefügt und Resete das Menu dort um die näcshte Seite zu laden in dem ich mit dem ersten count zähle wie viele wir überspringen (also die erste Seite und mit next_count zählen wir wieder 9 Items ab bis zum "Näcshten Seite".
Und Mit Set und GetPvarInt(playerid,"Auftrag_Seite") speichern und setzen wir usnere Seite /für die Mathematische Berechnung ).
Und wir haben das teleportmenu[playerid] nun playerid basierend um Bugs zu vermeiden.
hoffe, es war etwas verständlich als Erklärung.
Beachte bitte: "128 menus in total" und da das Menu dann Player abhängig sein müsste, wegen Nächste Seite, kann es bei zu vielen Spielern zu Probleme führen.
(Bei anderen Ansätzen, bin ich gerne offen, falls dieser unnötig oder co. ist)
MfG Mogly1.
-
Hey, schau mal Jeffry hatte dazu ein Tut gemacht.
evt. hilft dir das ja, wenn du das noch dann für dich anpasst.
MfG. Mogly1