Das ist mir doch wurst.
Du solltest du nur beim Speichern der Position dieselben Variablen benutzen wie beim Auslesen und dem nachfolgendem Spawning.
Beiträge von FACE
-
-
Nein!
So wird das auch nicht gehen, er muss auch die Positionen richtig auslesen
public OnPlayerDeath(playerid,killerid,reason){
SpielerInfo[playerid][Gestorben] = 1;
GetPlayerPos(playerid,SpielerInfo[playerid][PosXX],SpielerInfo[playerid][PosYY],SpielerInfo[playerid][PosZZ]);
return 1;
}Wenn du schon aus dem Array SpielerInfo ausliest, solltest du vielleicht auch genau vorher mal in dieses etwas schreiben
-
Exerzier das Ganze doch ersteinmal testweise für Sekunden durch.
Sagt bei sekunde 40 soll er die message plotten und du setzt den timer auf 1 sek.
So lässt sich der Fehler evtl schneller beheben.
Muss sich um irgendeinen Logikfehler handeln
(Eine Verschiebung oder so)
@ Maxx: Das ist nicht die Lösung, wenn er etwas zeitgesteuert tun möchte, was er auch im Vorfeld explizit zur Geltung gebracht hat.
-
Ich geb dir mal einen kleinen Happen
Das Skin Array:
new skins[/*Hier bitte die Anzahl der Skins eintragen*/] = { 2,3,5,6 };//SkinIDs eintragen, wie im Beispiel..Die Variable:
new IsPlayerInSkinSel[MAX_PLAYERS];Variable unter OnPlayerConnect auf "false" setzen: (man weiß ja nie, ob nicht ein vorheriger Spieler mit derselben ID den Server mit "true" verlassen hat)
IsPlayerInSkinSel[playerid]=-1;//-1 ist jetzt mal für uns false, da wir eigentlich noch eine zweite Variable benötigen, ich diese aber gerade einsparen möchte..Nun zu unserer KeyAbfrage:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(IsPlayerInSkinSel[playerid]!=-1)//Wenn Spieler in SkinSelection..
{if ((newkeys & KEY_SPRINT) && !(oldkeys & KEY_SPRINT))//Spieler hat leertaste gedrückt
{
if(IsPlayerInSkinSel[playerid]+1>sizeof(skins)){IsPlayerInSkinSel[playerid]=0;}else{IsPlayerInSkinSel[playerid]++;}
SetPlayerSkin(playerid,skins[IsPlayerInSkinSel[playerid]);
}if ((newkeys & KEY_SECONDARY_ATTACK) && !(oldkeys & KEY_SECONDARY_ATTACK))//Spieler hat enter gedrückt
{
SetCameraBehindPlayer(playerid);//Cam wieder hinter Spieler setzen.
TogglePlayerControllable(playerid, true);//Spieler entfreezen
//SpawnPlayer(playerid);//Spieler spawnen lassen ?? vielleicht lieber Position setzen..
//Das Skin setzen könnte sich beißen mit der normalen Skin-Selection, von daher benutze doch anschließend noch SetSpawnInfo.
}
}
return 1;
}Jetzt brauchen wir nurnoch den Weg hin zur Class-Selection..
Dies kann über ein Pickup, einen Command, ein Menü oder sonstwas geschehen.Egal wie, es wird trotzdem mindestens Folgendes dafür benötigt:
SetPlayerPos(playerid, X,Y,Z);//Werte für Spielerpos ersetzen
SetPlayerFacingAngle(playerid, R);//Ersetzen durch Rotation des SpielersSetPlayerCameraPos(playerid, X,Y,Z);//CameraPosition (ersetzen)
SetPlayerCameraLookAt(playerid, X,Y,Z);//Und auch hier durch den gewünschten Blickwinkel ersetzen.//SetPlayerInterior(playerid, I); - Nicht zwingend notwendig, sofern im selben Interior, wie sich der Spieler ohnehin schon befindet.
TogglePlayerControllable(playerid, false);//Spieler bewegungsunfähig machen.
Das ist jetzt aber wirklich genug Häppchen
(Um die Zeit und für "aus dem Kopf geschrieben" gibts keine Garantie)
-
Was soll denn diese Frage bedeuten??
Hau die Skins in ein Array, damit kannst du ja schonmal anfangen.
Den Boolean kannst du direkt danach erstellen.Danach kannst du dir mal die Koordinaten für deine Class-Selection besorgen (PlayerPos, CamPos, CamLookAt, InteriorID, etc..)
-
Speicher halt in einem Bool, ob sich der Spieler in deiner gebauten Skin-Selection befindet.
Wenn ja, dann gehst du über die interrupts vom OnPlayerKeyStateChange.
Speichere zuvor die Skins in einem Array und lese aus diesem beim drücken der Leertaste.
Die Skinauswahl an sich besteht aus einem Freeze, einer Spielerposition + Spielerrotation und einer CameraPos mit CameraLookAt. -
Da die Messages im Chat angezeigt werden, man sich aber auf der Dialog-Ebene bewegt, würde ich
hier eine Message im Dialog vorziehen:
//Oben im Script
#define kickinfo 255//Ersetz die 255 durch eine freie DialogID
if(dialogid==DIALOG_LOGIN)
{
if(response==0)
{
ShowPlayerDialog(playerid,kickinfo,DIALOG_STYLE_MSGBOX,"Server - Disconnect!","Du hast den Login-Vorgang abgebrochen.\nAls Folge wurdest du gekickt","Ok","");
Kick(playerid);
}if(response==1)
{
if(!strlen(inputtext)) //Wenn das Passwort falsch ist
{
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","{ff0000}FALSCHES PASSWORT.\n{ffffff}Gib bitte das richtige Passwort ein!","Login","Abbrechen");
}
else //Wenn das Passwort stimmt
{
Login(playerid,inputtext);
}
}
return 1;
} -
Du musst doch nur abfragen, ob die Minute null ist.
Hätte dann einen Timer auf eine Minute gesetzt, also 60000 Millisekunden.
(Alternativ auch noch 2 Minuten, ob die Message dann mal ne Minute später kommt, wird wohl eher egal sein.) -
ocmd und sscanf (oder sscanf2) erleichtern erleichtern das ganze Prozedere nur
Man kann das auch ohne schreiben -
Wenn du das Fahrzeug parkst, nimmst du die Koordinaten, da auch noch SetVehicleZAngle möglich
Nun zerstörst du das Fahrzeug und kreierst es direkt neu, mit den gespeicherten Daten.
CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay).
Angle ist dann hier vorhanden -
Warum zitierst du mich bitte ohne darauf einzugehen ??
Das entzieht sich meinem Denkvermögen.. -
Dann ergeben aber doch die Zeilen die ich gerade gepostet habe relativ wenig Sinn
Ich hätte eher die Erwartungshaltung gehabt, die Variable "fs" bezeichne die FraktionsID.Mit "fsWinFaction" als FraktionsID, sähe es evtl. so aus:
FraktionsKasse[fsWinFaction][FightSystem[fs][fsWinFaction]] += 75000; -
shaiN du hast dir den Code offenbar nicht sonderlich gründlich angesehen..
TextDrawHideForPlayer(i,FightSystem[fs][fsWinFaction]);
TextDrawHideForPlayer(i,FightSystem[fs][fsWinKills]);
Und in seinem zweiten Post meint der Threadsteller, dass fsWinFaction die ID bezeichnet..
Na? jetzt bist du hoffentlich auch stutzig. -
Das ergibt keinen Sinn.
Zeig doch mal bitte, wie dein Array definiert ist. -
Fraktionskasse ist doch ein Array also
Fraktionskasse[fraktionsID][betrag]Du hast jedoch keine FraktionsID angegeben sondern nur einen Betrag.
-
Die Dinger sind einfach nicht definiert..
Das sieht halt heftig nach C&P aus.
Tut mir leid, wenn ich daneben liegen sollte, aber das ist glaube einfach ein blind eingefügtes snippet.
Das jetzt du definieren macht keinen Sinn für mich.. -
Timmeyable:
Wenn es per Command ist, und der Parameter die Ziel-PlayerID ist. (bsp: /kill [playerid])Hätte es dann wie folgt gelöst:if(GetPlayerVehicleID(playerid)==GetPlayerVehicleID(targetplayerid)){...}
Schreibs halt auf deine Bedürfnisse um
AooH:
Irgendwo könnte sich ein http request oder Ähnliches befinden, der das Script mit einer online-gestellten version abgleicht.
Schau mal nach irgendwelchen connections, die ins externe leiten... -
@ EliteCake:
if(GetPlayerState(playerid) != 2) return SendClientMessage(playerid,Rot,"Du sitzt nicht bei deinem Kunden im Auto");
Konkrete Werte werden anders in der Negation abgefragt
-
Tipp: Bau deine lokale Speicherumgebung um.
Ähnlich einer Datenbank benutzt du Tabellen um Werte miteinander zu verbinden.Die helfende Tabelle für dieses Problem wäre eine, die eine Nummer (user-nummer) mit einem Usernamen verknüpft.
Eine Schleife durch die Nummern sollte so kein Problem mehr darstellenAlso aufbau des Files:
Damit sollte sich dein Problem dann lösen lassen.Ich hab oft dasselbe Problem und hab auch schon nach bequemeren Lösungsmethoden gesucht.
Jedoch bietet das Speichern von Relationen noch andere Vorzüge, die ich nichtmehr misen möchte.
MFG FACE. -
Handbremse heißt in keinem Fall, dass das Fahrzeug nicht fahrbar ist.
Wer mal mit angezogener Handbremse gefahren ist, weiß wovon ich rede.
Ich hätte in diesem Fall über OnPlayerKeyStateChange beim Beschleunigen des Fahrzeuges den Wagen
entschleunigt.
In diesem Fall würde ich die Velocity Funktionen in Betracht ziehen