Heyho leute,
Gibt es eine Möglichkeit zu überprüfen ob ein Spieler gerade ein Feuer bzw mehrere Feuer in einem bestimmten gelöscht hat?
Wenn ja, wie kann ich das genau abfragen bzw prüfen?
Danke schonmal im voraus.
LG Jan
Heyho leute,
Gibt es eine Möglichkeit zu überprüfen ob ein Spieler gerade ein Feuer bzw mehrere Feuer in einem bestimmten gelöscht hat?
Wenn ja, wie kann ich das genau abfragen bzw prüfen?
Danke schonmal im voraus.
LG Jan
gönn dir hier hast du ein schlnes feuerwehr system
💎[GF] Reallife SOM Version 0.5 (2016) MySQL R7 + UCP since 2013💎
gönn dir hier hast du ein schlnes feuerwehr system
💎[GF] Reallife SOM Version 0.5 (2016) MySQL R7 + UCP since 2013💎
Ist vielleicht nett gemeint aber ich würde gerne lernen wie ich das mit dem Feuer machen kann, da ich etwas vor habe.
Trotzdem danke.
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.
Alles anzeigenHier 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.
Ohne den Vergleich anhand eines Scripts zu sehen... wie gibt und nimmt man Objekten "leben" und vor allem, gibt es es eine demageObjekt Function als Callback?
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.
#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];
Alles anzeigen
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)
ocmd: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
}
Alles anzeigen
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.
#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;
}
Alles anzeigen
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
stock 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;
}
Alles anzeigen
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(: )
Float: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));
}
Alles anzeigen
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
public 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);
}
}
}
Alles anzeigen
natürlich muss dann das Objekt wieder leben haben, aber das Beispiel habe ich ja jetzt gezeigt.
MfG. Mogly1