@German_ScripterHD
Deine Funktion funktioniert nicht für alle Fahrzeuge. Ein Bus kann z. B. Mehr als 4 Personen mitnehmen, Da würde deine Funktion schon nicht mehr funktionieren. ![]()
[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
-
-
@German_ScripterHD
Deine Funktion funktioniert nicht für alle Fahrzeuge. Ein Bus kann z. B. Mehr als 4 Personen mitnehmen, Da würde deine Funktion schon nicht mehr funktionieren.
Ich meine, seine Funktion hilft mir ja dennoch gut weiter, da ich es im Moment nur für Fahrzeuge mit 4 Sitzen benötige
und wahrscheinlich auch weiterhin nur für 4 Sitze, ich wüsste nicht wieso ein Sanitäter einen Verletzten in ein Bus ziehen sollte xD -
Deine Funktion funktioniert nicht für alle Fahrzeuge. Ein Bus kann z. B. Mehr als 4 Personen mitnehmen, Da würde deine Funktion schon nicht mehr funktionieren.
Gut, das stimmt allerdings.
@fishy Ich habe dir gerade nochmal eine neue Funktion geschrieben, die etwas besser geeignet ist.
Mit der Funktion kannst du abfragen ob der Sitzplatz belegt ist oder nicht. -
Mit der Funktion kannst du abfragen ob der Sitzplatz belegt ist oder nicht.
Drehe das return 1 und return 0 um, sonst wäre es "IsSeatUsed".

-
Hi, wie kann ich ein Befehl für ein bestimmtes Spieler Level erlauben / nicht erlauben? (Score)
-
-
Das weiß ich, aber ich weiß nicht wie man das Beispiel richtig anwendet.
-
If(GetPlayerScore(playerid) >= dein level)
{
//deine Funktion
}
else
{
SendClientMessage(playerid, Rot, "Du hast nicht das richtige Level");
} -
Das weiß ich, aber ich weiß nicht wie man das Beispiel richtig anwendet.
So vielleicht?
Code
Alles anzeigenpublic OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/mycommand", cmdtext, true, 10) == 0) { new score = GetPlayerScore(playerid); if(score >= 5) // >= ist Größer Gleich. z.B. in diesem Fall: Level 5 und höher { // do action } return 1; } return 0; }
Soo ich brauch wie immer Hilfe..Wenn ich in ein Fahrzeug gehe und /motor eingebe passiert nix, Spieler mit der selben Fraktions ID wie des Fahrzeuges sollen den Motor betätigen können, aber im Fahrzeug selber passiert nichts mehr...
befehlCode
Alles anzeigenocmd:motor(playerid, params[]) { new carid = GetPlayerVehicleID(playerid); if(!IsPlayerConnected(playerid)) return ERR_NO_CON if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_BEFEHL, "Du bist in keinem Fahrzeug."); if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_BEFEHL, "Du bist nicht der Fahrer."); new tmp_engine,tmp_lights,tmp_alarm,tmp_doors,tmp_bonnet,tmp_boot,tmp_objective; GetVehicleParamsEx(carid,tmp_engine,tmp_lights,tmp_alarm,tmp_doors,tmp_bonnet,tmp_boot,tmp_objective); for(new i = 0; i < sizeof(Vehicle); i++) { if(!Vehicle[i][SID])continue; // Oder wie auch immer du es nun genannt hast. if(Vehicle[i][SID] != carid)continue; if(Vehicle[i][fFrak] == PlayerInfo[playerid][pFrak]) //Die ID der Fraktion eintragen. { if(tmp_engine == 0) { tmp_engine = 1; SendClientMessage(playerid, COLOR_INFO, "Der Motor startet..."); SetPlayerChatBubble(playerid, "Startet den Motor.", COLOR_ACTION, 20.000, 4000); } else if(tmp_engine == 1) { tmp_engine = 0; SendClientMessage(playerid, COLOR_INFO, "Der Motor ist aus."); } } else { SendClientMessage(playerid, COLOR_BEFEHL, "Du hast keine Schlüssel."); return 1; } } SetVehicleParamsEx(carid,tmp_engine,tmp_lights,tmp_alarm,tmp_doors,tmp_bonnet,tmp_boot,tmp_objective); return 1; }
fahrzeug ladesystem:Code
Alles anzeigenstock LoadVehs() { new rows,fields; new Cache:Vehs = mysql_query(handle, "SELECT * FROM `fahrzeuge`",true); cache_get_data(rows,fields); for(new i=0;i<rows;i++) { Vehicle[i][VID] = cache_get_field_content_int(i, "id"); Vehicle[i][fModel] = cache_get_field_content_int(i, "modelid"); Vehicle[i][fSposX] = cache_get_field_content_float(i, "sPos-X"); Vehicle[i][fSposY] = cache_get_field_content_float(i, "sPos-Y"); Vehicle[i][fSposZ] = cache_get_field_content_float(i, "sPos-Z"); Vehicle[i][fSposO] = cache_get_field_content_float(i, "sPos-O"); Vehicle[i][fColor1] = cache_get_field_content_int(i, "color_1"); Vehicle[i][fColor2] = cache_get_field_content_int(i, "color_2"); Vehicle[i][fSirene] = cache_get_field_content_int(i, "sirene"); Vehicle[i][fFrak] = cache_get_field_content_int(i, "fraktion_id"); Vehicle[i][fFuel] = cache_get_field_content_int(i, "tank"); cache_get_field_content(i,"lastdriver", Vehicle[i][fLastDriver],handle,64); cache_get_field_content(i,"plate", Vehicle[i][fPlate],handle,32); SetVehicleParamsEx(i, false, false, false, false, false, false, false); Vehicle[i][SID] /*= cache_get_field_content_int(i, "id");*/ = CreateVehicle(Vehicle[i][fModel],Vehicle[i][fSposX],Vehicle[i][fSposY],Vehicle[i][fSposZ],Vehicle[i][fSposO],Vehicle[i][fColor1],Vehicle[i][fColor2], CAR_RESPAWN_TIME,Vehicle[i][fSirene]); new numberplate[256]; format(numberplate, sizeof (numberplate), "%s %d", Vehicle[i][fPlate], Vehicle[i][VID]); SetVehicleNumberPlate(Vehicle[i][SID], numberplate); if (Vehicle[i][fFrak] == 3) { if (Vehicle[i][fModel] == 560) { SireneSAMD[i] = CreateObject(19419, 0.00, 0.20, 0.85, 0.00, 0.00, 0.00, 50.0); AttachObjectToVehicle(SireneSAMD[i], Vehicle[i][SID], 0.00, 0.00, 0.81, 0, 0, 0); } } } cache_delete(Vehs); print("Vehicles Spawned"); return 1; } -
Versuche zuerst:
else if(tmp_engine == 1)
zu:
elseUnd
if(tmp_engine == 0)
zu:
if(tmp_engine != 1)Falls das nicht klappt:
Ändere
if(!Vehicle[i][SID])continue;
zu:
printf("i: %d / SID: %d / carid: %d", i, Vehicle[i][SID], carid);
if(!Vehicle[i][SID])continue;
Und poste was im Server Log steht, wenn du den Befehl eingibst. -
Funktioniert jetzt, Danke

-
Funktioniert jetzt, Danke
Ok, super.
Noch der Grund dazu, warum es jetzt funktioniert:
Es gibt bei GetVehicleParamsEx 3 verschiedene Stati, im Falle des Motors ist das so:
0 = Aus
1 = An
-1 = Ungesetzt (entspricht 0).Daher reicht es nicht, auf 1 und 0 zu prüfen.
https://wiki.sa-mp.com/wiki/GetVehicleParamsEx

Das kommt bei dir zu Stande, weil du SetVehicleParamsEx vor CreateVehicle ausführst.
Ändere also beim Laden noch:
SetVehicleParamsEx(i, false, false, false, false, false, false, false);
zu:
SetVehicleParamsEx(Vehicle[i][SID], false, false, false, false, false, false, false);
Und setze es eine Zeile drunter unter CreateVehicle hin.Behalte die Änderung mit nur "else" dennoch bei.
-
Hey, ich habe in einem Timer eine menge spielerbezogene Funktionen, da es ein Timer ist, habe ich eine Schleife eingebunden.
Jetzt habe ich das Problem: Die Schleife arbeitet unabhängig vom Timer.Beispiel:
Die Schleife (obwohl nur 1 Spieler aufm Server ist) wird ca. 20x die Sekunde abgerufen, obwohl der Timer auf 1 Sekunde liegt.
Wie ändere ich das?Timer:
ongamemodeinitSetTimer("SecTimer", 1000, 1);
Code
Alles anzeigenforward SecTimer(); public SecTimer() { new uhour, umin, usecs; gettime(uhour, umin, usecs); for (new i=0; i < MAX_PLAYERS; i++) { printf("%02d %d02 %02d Test 2", uhour, umin, usecs); if(PlayerInfo[i][pLoggedIn] == false) continue; new vw = GetPlayerVirtualWorld(i); new Float:HP; new Float:X, Float:Y, Float:Z; GetPlayerPos(i, X, Y, Z); GetPlayerHealth(i, HP); if(HP <= 14.000) { if(IsPlayerConnected(i)) { if(PlayerInfo[i][pLoggedIn] == true) { if(IsInjured[i] == false) { IsInjured[i] = true; InjuredTimer[i] = 240; Invulnerable[i] = true; InvulCounter[i] = 3; new dstr[528]; format(dstr, sizeof (dstr), "%s ist schwer verletzt und braucht einen Sanitäter! /Medic %d", PlayerInfo[i][pName], i); MedicMessage("|__________________________Achtung_________________________|"); MedicMessage(dstr); MedicMessage("|__________________________________________________________|"); new string[128]; format(string, sizeof(string), "(( %s ist verletzt und liegt am Boden.\nEr braucht einen Krankenwagen! ))", PlayerInfo[i][pName]); InjuredLabel[i] = Create3DTextLabel(string, 0xFF6666FF, X, Y, Z, 25.00, vw, 1); Attach3DTextLabelToPlayer(InjuredLabel[i], i, 0.00, 0.00, 0.500); ApplyAnimation(i, "PED", "KO_shot_stom", 4.1, 1, 0, 0, 1, 0, 1); notruf[i] = 1; } } } } if(InvulCounter[i] > 0) { InvulCounter[i] -= 1; if(InvulCounter[i] == 0) { Invulnerable[i] = false; } } if(InjuredTimer[i] > 0) { if(IsDead[i] == false) { ApplyAnimation(i, "CRACK", "crckdeth2", 4.1, 1, 0, 0, 1, 0, 1); InjuredTimer[i] -= 1; if(InjuredTimer[i] == 0) { ClearAnimations(i); if(IsHealed[i] == false) { SendAction(i, "ist soeben verstorben."); SetPlayerHealth(i, 0); Delete3DTextLabel(InjuredLabel[i]); IsDead[i] = true; IsInjured[i] = false; } } } } if(PlayerInfo[i][pKicked] == 1) { Kick(i); } ResetPlayerMoney(i); GivePlayerMoney(i, PlayerInfo[i][pMoney]); if(PlayerInfo[i][pPrison] <= 0) { PlayerInfo[i][pPaydaySecs] += 1; if(PlayerInfo[i][pPaydaySecs] == 60) { PlayerInfo[i][pPaydayMins] += 1; PlayerInfo[i][pPaydaySecs] = 0; if(PlayerInfo[i][pPaydayMins] == 60) { Payday(i); PlayerInfo[i][pPaydayMins] = 0; } } } SetPlayerTime(i, uhour, umin); if(PlayerInfo[i][pDigCD] > 0) { PlayerInfo[i][pDigCD] -= 1; if(PlayerInfo[i][pDigCD] == 0) { SendClientMessage(i, COLOR_INFO, "** Du kannst wieder Müll durchwühlen!"); } } if(PlayerInfo[i][pKH] > 0) { PlayerInfo[i][pKH] -= 1; if(PlayerInfo[i][pKH] == 0) { SpawnPlayer(i); UnfreezePlayer(i); PlayerInfo[i][pMoney] -= 500; GivePlayerMoney(i, -500); SendClientMessage(i, COLOR_LIGHT_RED, "Du konntest noch von den Ärtzten gerettet werden... Behandlungskosten: $500"); } } if(PlayerInfo[i][pJail] > 0) { if(PlayerInfo[i][pPrison] == 0 && PlayerInfo[i][pKH] == 0) { PlayerInfo[i][pJail] -= 1; if(PlayerInfo[i][pJail] == 0) { SpawnPlayer(i); } } } if(PlayerInfo[i][pPrison] > 0 && PlayerInfo[i][pKH] == 0) { PlayerInfo[i][pPrison] -= 1; if(PlayerInfo[i][pPrison] == 0) { SpawnPlayer(i); } } RepairVehicle(admincar[i]); SetVehicleHealth(admincar[i], 6000.000); break; } return 1; }Edit: Es ist nur übertrieben schnell wenn 0 Spieler on sind, wenn 1 Spieler on ist, funktioniert es doch mit1 Sekunde

-
Frage direkt ganz oben in der Schleife ab ob der Spieler connected ist,sprich direkt über den printf.
-
Und wie sollte ich dann vorgehen?
Falls nicht connected: return, break oder continue? -
Falls nicht connected dann mit continue.
Damit der nächste Spieler abgefragt wird. -
-
Der Timer wird nicht so oft ausgeführt.
Der Timer wurde (vor meiner Version) so oft ausgeführt, wie MAX_PLAYERS auch definiert war (ein kleiner Teil wurde ausgeführt, danach kam die Abfrage ob ein Spieler connected ist.)
Jetzt sollte der Timer nicht mehr aufgerufen werden, wenn der Spieler (i) auch nicht connected ist.Die Anzahl in der samp.cfg hat auch nichts mit MAX_PLAYERS zu tun, das kannst du nur im Script ändern. Die Zahl in der samp.cfg ändert den Wert von GetMaxPlayers().
-
Code
Alles anzeigenforward SecTimer(); public SecTimer() { printf("%02d %d02 %02d Test 2", uhour, umin, usecs); new uhour, umin, usecs; gettime(uhour, umin, usecs); for (new i=0; i < MAX_PLAYERS; i++) { if(PlayerInfo[i][pLoggedIn] == false) continue; new vw = GetPlayerVirtualWorld(i); new Float:HP; new Float:X, Float:Y, Float:Z; GetPlayerPos(i, X, Y, Z); GetPlayerHealth(i, HP); if(HP <= 14.000) { if(IsPlayerConnected(i)) { if(PlayerInfo[i][pLoggedIn] == true) { if(IsInjured[i] == false) { IsInjured[i] = true; InjuredTimer[i] = 240; Invulnerable[i] = true; InvulCounter[i] = 3; new dstr[528]; format(dstr, sizeof (dstr), "%s ist schwer verletzt und braucht einen Sanitäter! /Medic %d", PlayerInfo[i][pName], i); MedicMessage("|__________________________Achtung_________________________|"); MedicMessage(dstr); MedicMessage("|__________________________________________________________|"); new string[128]; format(string, sizeof(string), "(( %s ist verletzt und liegt am Boden.\nEr braucht einen Krankenwagen! ))", PlayerInfo[i][pName]); InjuredLabel[i] = Create3DTextLabel(string, 0xFF6666FF, X, Y, Z, 25.00, vw, 1); Attach3DTextLabelToPlayer(InjuredLabel[i], i, 0.00, 0.00, 0.500); ApplyAnimation(i, "PED", "KO_shot_stom", 4.1, 1, 0, 0, 1, 0, 1); notruf[i] = 1; } } } } if(InvulCounter[i] > 0) { InvulCounter[i] -= 1; if(InvulCounter[i] == 0) { Invulnerable[i] = false; } } if(InjuredTimer[i] > 0) { if(IsDead[i] == false) { ApplyAnimation(i, "CRACK", "crckdeth2", 4.1, 1, 0, 0, 1, 0, 1); InjuredTimer[i] -= 1; if(InjuredTimer[i] == 0) { ClearAnimations(i); if(IsHealed[i] == false) { SendAction(i, "ist soeben verstorben."); SetPlayerHealth(i, 0); Delete3DTextLabel(InjuredLabel[i]); IsDead[i] = true; IsInjured[i] = false; } } } } if(PlayerInfo[i][pKicked] == 1) { Kick(i); } ResetPlayerMoney(i); GivePlayerMoney(i, PlayerInfo[i][pMoney]); if(PlayerInfo[i][pPrison] <= 0) { PlayerInfo[i][pPaydaySecs] += 1; if(PlayerInfo[i][pPaydaySecs] == 60) { PlayerInfo[i][pPaydayMins] += 1; PlayerInfo[i][pPaydaySecs] = 0; if(PlayerInfo[i][pPaydayMins] == 60) { Payday(i); PlayerInfo[i][pPaydayMins] = 0; } } } SetPlayerTime(i, uhour, umin); if(PlayerInfo[i][pDigCD] > 0) { PlayerInfo[i][pDigCD] -= 1; if(PlayerInfo[i][pDigCD] == 0) { SendClientMessage(i, COLOR_INFO, "** Du kannst wieder Müll durchwühlen!"); } } if(PlayerInfo[i][pKH] > 0) { PlayerInfo[i][pKH] -= 1; if(PlayerInfo[i][pKH] == 0) { SpawnPlayer(i); UnfreezePlayer(i); PlayerInfo[i][pMoney] -= 500; GivePlayerMoney(i, -500); SendClientMessage(i, COLOR_LIGHT_RED, "Du konntest noch von den Ärtzten gerettet werden... Behandlungskosten: $500"); } } if(PlayerInfo[i][pJail] > 0) { if(PlayerInfo[i][pPrison] == 0 && PlayerInfo[i][pKH] == 0) { PlayerInfo[i][pJail] -= 1; if(PlayerInfo[i][pJail] == 0) { SpawnPlayer(i); } } } if(PlayerInfo[i][pPrison] > 0 && PlayerInfo[i][pKH] == 0) { PlayerInfo[i][pPrison] -= 1; if(PlayerInfo[i][pPrison] == 0) { SpawnPlayer(i); } } RepairVehicle(admincar[i]); SetVehicleHealth(admincar[i], 6000.000); break; } return 1; } -
Habe da nochn Problem beim Timer, wie man vllt gesehen hat habe ich ein eigenes Todessystem, (Bei low HP ist man verletzt etc.), dies wird auch jede Sekunde abgefragt.
Problem: Manchmal (nicht immer) kriege ich nach dem Login die Animation & Freeze & Zeit des verletzt seins, obwohl ich beim Spawn 75 HP habe, und beim Timer <= 14 HP angegeben ist,woran könnte das liegen, wie wirds vermieden?
(Btw, Danke es klappt jetzt mit dem Timer, dass es jede Sekunde ausgeführt wird statt 4000000x in ner Sekunde)
-
