Beitrag von BlackDown000003 ()
Dieser Beitrag wurde von Trooper[Y] aus folgendem Grund gelöscht: Das sagt dir hier keiner weil du hier absolut falsch bist. Mach einen eigenen Thread dafür auf. ().
Hey,
wie ist der beste und einfachste Weg um abzufragen ob ein ein Vehicle einen freien Beifahrersitz hat, und dann einen Spieler in diesen zu packen?
z.B. bei einem /Grab Befehl.
Befehl:
ocmd:grab(playerid, params[])
{
new pid, ptnid;
if(!IsPlayerConnected(playerid)) return ERR_NO_CON
if(PlayerInfo[playerid][pFrak] == 3)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_BEFEHL, "Du musst der Fahrer sein!.");
if(IsPlayerInAnyVehicle(ptnid)) return SendClientMessage(playerid, COLOR_BEFEHL, "Dein Partner muss außerhalb des Fahrzeuges beim Verletzten sein.");
if(sscanf(params, "uu", pid, ptnid)) return SendClientMessage(playerid, COLOR_BEFEHL, "Nutze: /grab [ID/Name] [Partner-ID]");
if(!IsPlayerConnected(pid)) return ERR_NO_CON_PL
if(!IsPlayerConnected(ptnid)) return ERR_NO_CON_PL
new Float:InjX, Float:InjY, Float:InjZ;
new Float:ptnX, Float:ptnY, Float:ptnZ;
if(!IsPlayerInRangeOfPoint(playerid, 6, injX, injY, injZ)) return SendClientMessage(playerid, COLOR_BEFEHL, "Du musst näher beim Verletzten sein.");
if(!IsPlayerInRangeOfPoint(playerid, 6, ptnX, ptnY, ptnY)) return SendClientMessage(playerid, COLOR_BEFEHL, "Du musst näher beim Partner sein.");
if(!IsPlayerInRangeOfPoint(ptnid, 2, injX, injY, injZ)) return SendClientMessage(playerid, COLOR_BEFEHL, "Dein Partner muss näher beim Verletzten sein.");
if(IsPlayerInAnyVehicle(pid)) return SendClientMessage(playerid, COLOR_BEFEHL, "Der Verletzte muss außerhalb eines Fahrzeuges sein.");
return 1;
}
return 1;
}
Alles anzeigen
Du kannst dir mal folgende Funktion anschauen: [wiki]GetPlayerVehicleSeat[/wiki]
Ich habe auch mal eben eine kleine Funktion geschrieben, diese Setzt den Spieler auf einen Freienplatz im Fahrzeug. ((vielleicht kannst du dies auch gebrauchen))
stock PutPlayerInFreeVehicleSeat(vehid,playerid){
new bool:seat[4];
for(new i = 0; i < MAX_PLAYERS; i++){
if(IsPlayerConnected(i)){
if(IsPlayerInVehicle(i,vehid)){
if(GetPlayerVehicleSeat(i) == 0) seat[0] = true;
if(GetPlayerVehicleSeat(i) == 1) seat[1] = true;
if(GetPlayerVehicleSeat(i) == 2) seat[2] = true;
if(GetPlayerVehicleSeat(i) == 3) seat[3] = true;
}
}
}
for(new id = 0; id < sizeof seat; id++)if(seat[id] == false)PutPlayerInVehicle(playerid,vehid,id);
return 1;
}
Alles anzeigen
@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.
@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?
public 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;
}
Alles anzeigen
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...
befehl
ocmd: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;
}
Alles anzeigen
fahrzeug ladesystem:
stock 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;
}
Alles anzeigen
Versuche zuerst:
else if(tmp_engine == 1)
zu:
else
Und
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:
ongamemodeinit
SetTimer("SecTimer", 1000, 1);
forward 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;
}
Alles anzeigen
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.