Tut mir leid für Wasser.
Beiträge von 8D
-
-
Wenn interessiert Schnelligkeit schon?
Du nicht benutzt 10k CMDS gleichzeitig, wenn du spielst alleine auf Homeserver ohne Freunde, so wie ich. -
Okay ich nehme an deine Sorries, aber next time will ich lesen, dass ich bin dein Honey
-
Guck vor Zeile 3016, da muss sein Klammerfehler. Irgendwo.
-
Und bald kommt XCMD YCMD ZCMD gibts ja schon, und dann reicht unser Alphabet nischt mehr, und dann wir klauen Griechenland nicht nur Geld sondern auch Lexikon und Buchstaben.
-
wofür du brauchst schneller?
Bleib bei Basis strcmp und strtok.
Das ist mein Tipp für disch -
Nur weil ich nicht gut sprechen Deutsch, ich bin ein Idiot?
Du kannst denken von mir, was du willst, aber meine Skills sind greater als du! -
Isch weiß du nix kannst zählen, aber du kannst denken!
Ja ohne Nickie, sprich "!" gehts.
WTF i know! -
er meint das du es es so gemacht hast das alle es aufmachen können nur cops nich benutzt du gf ??? wenn ja dann sag ich dir wie
Warum tust du antworten ihm?
Ich hab Antwort gegeben, basta! Thread Closed, Thema doof. -
Okay ich will dich bringen bei, was du gemacht hast verkehrt.
Erstens.
Guckst du hier, du gibst als Länge des Cmds 10, ist nur 9, aber ist egal.
Dann fragst du ab if(!IsACop(playerid), sprich wenn du Cop bist und läufst herum mit dicker Hose, du nix kannst öffnen Tor, weil du bist Cop, und du verlangst kein Cop!//Edit: Sorry, ich nix kann deutsch, nur schlecht kann Deutsch, aber isch bin ein Berliner!
-
Stimmt dann hätten wir nur ein Array, so wie bei deinem Haussystem.
Ich bringe noch die abgeänderte Version die Tage ^^, Danke. -
if(PickUps == StehtaufPickUp[playerid])
Erinnert ihr euch? Wir hatten eine Variable im enum des Typs bool(ean).
Das ist jetzt entscheidend. Es wird abgefragt, ob diese Variable den Wert true, oder false hat, sprich ob es ein Hin-Teleporter, also das Pickup ist vor dem Gebäude(false) oder ein Rück-Teleporter, also das Pickup befindet sich im Gebäude(true), ist.
if(PickUpsCoords[Rueck] == false)
Wenn wir uns also auf einem Pickup befinden, was der Hin-Teleporter sein soll, müssen wir, da wir ja brav sind, und uns am Schemata gehalten haben, uns die Infomationen des nächsten Speicherplatz holen, also vom Rückteleporter.
Also:
SetPlayerPos(playerid,PickUpsCoords[i+1][eX],PickUpsCoords[i+1][eY],PickUpsCoords[i+1][eZ]);
SetPlayerInterior(playerid,PickUpsCoords[i+1][interior]);
SetPlayerVirtualWorld(playerid,PickUpsCoords[i+1][Virtualworld]);
StehtaufPickUp[playerid] = -1;
Ihr seht ja, was ich gerade erklärt habe, am [i+1].
Falls wir uns nun aber auf einem Pickup befinden, was der Rück-Teleporter sein soll, müssen wir ja umgekehrt arbeiten, und uns die Informationen des vorherigen Speicherplatz holen, sprich von Hinteleporter.Also:
SetPlayerPos(playerid,PickUpsCoords[i-1][eX],PickUpsCoords[i-1][eY],PickUpsCoords[i-1][eZ]);
SetPlayerInterior(playerid,PickUpsCoords[i-1][interior]);
SetPlayerVirtualWorld(playerid,PickUpsCoords[i-1][Virtualworld]);
StehtaufPickUp[playerid] = -1;Alle geschweiften offenen Klammern wieder schließen und fertig.
Das ist der Teil des Tutorials, der uns Codes für 100 Ein-und Ausgänge, sprich ca. 2000 Zeilen Code mit if(PlayerToPoint) oder if(IsPlayerInRangeOfPoint) Abfragen für jeden Teleporter spart :).Zum Schluss müssen wir uns noch die Funktion IsPlayerNearToEnterExit einbauen, da ja bei OnPlayerPickUpPickup, die Variable StehtaufPickUp einmalig gesetzt wird, bis man aufs nächste Pickup geht.
Das hätte zur Folge, dass wir uns ja dann einmal aufs Pickup stellen, ganz weit weglaufen, Enter drücken und uns teleportieren könnten, also nicht sehr realistisch.
Genug zur Theorie. Fügt das Ende des Scripts ein.public PlayerIsNearToEnterExit(playerid)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
for(new i = 0; i <= sizeof PickUps; i++)
{
if(IsPlayerInRangeOfPoint(playerid,0.5,PickUpsCoords[i][eX],PickUpsCoords[i][eY],PickUpsCoords[i][eZ]))
{
return 1;
}
}
return 0;
}Und oben im Script noch ein:
forward PlayerIsNearToEnterExit(playerid)
So jetzt könnt ihr ganz leicht Ein- und Ausgänge erstellen, einfach das Definierte erhöhen immer, und dann im Array PickUpsCoords Hin und danach Rückteleporter-Informationen nach den beiden Schemata einfügen.
Ich hoffe, dass ich alles ausführlich erklärt habe und freue mich auf Kritik.
Fabi / 8D.
-
Liebe sa-mp.de Benutzer,
ich habe gerade mal die Suchfunktion im Tutorial-Bereich benutzt, um zu schauen, ob dieses Tutorial überhaupt notwendig ist.
Und ja es ist notwendig .
Es gibt hier viele Tutorials über eigene Ein und Ausgänge ohne CMD, aber irgendwie, zumindest kommt es so rüber, dass ich bei ca. 100 Ein und Ausgängen nachher mehr Code davon habe, als der Rest vom Script.
Daher finde ich es doch notwenig, mal zu zeigen wie Ich soetwas lösen würde, da es natürlich bestimmt noch andere Varianten gibt.Um eigene Ein- und Ausgänge zu erstellen, müssen die alten erstmal raus.
Dafür gibt es eine leichte Methode, nämlich:DisableInteriorEnterExits();
Das fügt ihr bei dem Callback: OnGameModeInIt hinein, sollte eigentlich bekannt sein.
Nunja, um Teleporter zu erstellen, brauchen wir erstmal etwas, was diese als solche kennzeichnet, kurz gesagt "PickUps".
Wie euch bekannt sein sollte, braucht die Funktion "CreatePickup" natürlich Übergabeparameter, nämlich Erscheinungsbild(model),Typ(type),Position(X,Y,Z) und Virtual-World.So nun gibt es Leute unter uns, die fangen so an:
new pickup1;
new pickup2;
//usw.Dann gibt es "schlauere" Leute, die fangen so an:
new pickups[100]; .
Doch alle machen dann den Fehler bei OnGameModeInit.
Sieht dann ungefähr so aus:
pickup1 = CreatePickup(...)
oder so
pickups[0] = CreatePickup(...)Bei 100 Ein- und Ausgängen wünsche ich den Leuten an dieser Stelle viel Spaß.
So nun kommen wir zu meinem Vorschlag.Ein 2-D(imensionales) Array + eine enum Struktur arbeiten viel effektiver.
Zur Erklärung:
By Goldkiller :
ZitatFür sowas erstelle ich immer ein enum,ist mit dem Array vergleichbar nur besser :].
Man kann verschiedene Typen haben und direkt über einen Namen auf den Index zugreifen (Hoffe ich hab das jetzt nicht völlig falsch erklärt.DMA kann ja sein Wissen hier zur schau stellen :P)Nunja in diesem Enum können wir also verschiedene Typen haben, was bei den Übergabeparametern ja ebenfalls der Fall ist. Zufall? Wer weiß?
Also das enum würde so aussehen:
enum picks{
Float:eX,
Float:eY,
Float:eZ,
interior,
bool:Rueck,
Virtualworld
}Die X,Y,Z - Werte sind also Float-Werte, wer nicht weiß, was Float-Werte sind, sollte in einer neuen Registerkarte, das Wiki durchstöbern.
Wofür interior?
Um uns am Ende viel Code zu ersparen geben wir hier das Interior an, in welchem sich das Pickup befindet.
Rueck vom Typ bool(ean), gibt an, ob es ein Hin, oder Rück-Teleporter ist, in diesem Falle Im Gebäude, oder draussen.
Virtualworld ist ein Übergabeparameter für die Funktion CreatePickup(...).
Das ganze packen wir nun in ein 2-Dimensionales Array.new PickUpsCoords[PICK_UPS][picks] = {};
Wir werden dem Array eine Größe durch etwas definiertes ausdrücken.
Nämlich:
#define PICK_UPS 2 // Die 2 steht für die Anzahl ALLER Teleporter (Hin und Rück - Differenziert)
So nun müssen wir ja aber auch die Werte im enum initialisieren.
Dies passiert so:new PickUpsCoords[PICK_UPS][picks] = {
// Nach dem Schema: X,Y,Z,Interior des Pickups, Rück Porter - ja / nein, VW
{-316.1541,829.8519,14.2422,0,false,0}, // Amunation IN
{285.8248,-40.8825,1001.5156,1,true,0} // Amunation OUTWie schon erklärt: Der erste Wert stell eX des enum dar, der zweite eY, der dritte eZ, der vierte interior, der fünfte Rueck und der sechste Virtualworld.
Wichtig dabei ist, dass ihr Schemata/Schemas(xD, ja ist leider so) beibehalten: Ersten das, was ich einen Satz zuvor erklärt habe. Und zweitens, dass immer der Hin-Teleporter, in diesem Falle der draussen vor dem Gebäude ist immer als erstes kommt. Sprich wenn ich jetzt Vier Teleporter erzeugen möchte, sieht das Array so aus:new PickUpsCoords[PICK_UPS][picks] = {
// Nach dem Schema: X,Y,Z,Interior des Pickups, Rück Porter - ja / nein, VW
{-316.1541,829.8519,14.2422,0,false,0}, // Amunation IN
{285.8248,-40.8825,1001.5156,1,true,0}, // Amunation OUT
172.9729,1177.1868,14.7578,0,false,0}, // Cluckin Bell IN
{365.0766,-11.8404,1001.8516,9,true,0} // Cluckin Bell OUT};
Und so weiter.. Natürlich müssten wir jetzt bei 4 Teleportern folgendes ändern.
#define PICK_UPS 4
So nun müssen wir noch ein Array erstellen, was die Pickup-ID's also die return-Werte von der Funktion CreatePickup(...) speichert.
new PickUps[PICK_UPS];
Dass wir wieder mit "PICK_UPS" arbeiten, macht es einfach, denn so sind beide Arrays, also das 1D und 2D immer von der Größe gleich.
So nun erzeugen wir die Pickups mit der Funktion CreatePickup, und zwar unter OnGameModeInit.
Hier haben wir schon das erste Ziel meines Tutorials erreicht. Anstatt jetzt z.B 100 Pickups per Hand zu erstellen, übernimmt eine For-Schleife diese arbeit.
Das ganze sieht dann so aus bei OnGameModeInIt.for(new i = 0; i <= sizeof(PickUps); i++)
{
PickUps[i] = CreatePickup(1318,23,PickUpsCoords[i][eX],PickUpsCoords[i][eY],PickUpsCoords[i][eZ],PickUpsCoords[i][Virtualworld]);
}
Damit sparen wir schonmal die erste "Handarbeit".
1318 ist das Pickup Model, in diesem Falle der Pfeil nach unten und 23 der Pickup Typ, in diesem Falle, pickupable(!) but dont disappear on pickup, glaube ich.
Also für uns der richtige Typ, denn es geht so weiter.Wir betrachten das Callback: OnPlayerPickUpPickup, welches zwar klein, aber wichtig für uns ist.
Dort fügt ihr folgendes ein:
for(new i = 0; i <= sizeof PickUps; i++)
{
if(pickupid == PickUps[i])
{
StehtaufPickUp[playerid] = pickupid;
}
}Warum brauchen wir das Spielerbezogene Array StehtaufPickUp?
Ganz einfach, wir könnten uns das jetzt sparen und mit einer Timer-Delay Struktur arbeiten, aber auf den modernen Servern benutzt man jetzt gerne die Enter Taste um Gebäude zu betreten, was ich hier jetzt auch umsetzen werde.
Da also pickupid uns ausserhalb des Callbacks nicht mehr zur Verfügung steht, speichern wir den Wert eben in das Array hinein.Also brauchen wir oben im Script noch ein
new StehtaufPickUp[MAX_PLAYERS];
und bei OnPlayerConnect ein:
StehtaufPickUp[playerid] = -1
Soweit so gut, aber richtig viel ist uns noch nicht erspart geblieben, durch dieses Tutorial, aber das ändert sich jetzt.
Wir wollten uns ja mit dem "Entertaste-Teleporter" beschäftigen, also brauchen wir das Callback: OnPlayerKeyStateChange.Dort fügen wir folgendes ein.
if(newkeys == KEY_SECONDARY_ATTACK)
{
if(PlayerIsNearToEnterExit(playerid))
{
for(new i = 0; i <= sizeof(PickUps); i++)
{
if(PickUps[i] == StehtaufPickUp[playerid])
{
if(PickUpsCoords[i][Rueck] == false)
{
SetPlayerPos(playerid,PickUpsCoords[i+1][eX],PickUpsCoords[i+1][eY],PickUpsCoords[i+1][eZ]);
SetPlayerInterior(playerid,PickUpsCoords[i+1][interior]);
SetPlayerVirtualWorld(playerid,PickUpsCoords[i+1][Virtualworld]);
StehtaufPickUp[playerid] = -1;
}
else if(PickUpsCoords[i][Rueck] == true)
{
SetPlayerPos(playerid,PickUpsCoords[i-1][eX],PickUpsCoords[i-1][eY],PickUpsCoords[i-1][eZ]);
SetPlayerInterior(playerid,PickUpsCoords[i-1][interior]);
SetPlayerVirtualWorld(playerid,PickUpsCoords[i-1][Virtualworld]);
StehtaufPickUp[playerid] = -1;
}
}
}
}Erklärung:
if(newkeys == KEY_SECONDARY_ATTACK):
Fragt ab, ob der Spieler die Enter / F Taste gedrückt hat.
Wenn das zutrifft, dann:
if(PlayerIsNearToEnterExit(playerid))
Wird abgefragt, ob der Spieler sich an einem PickUp befindet. Diese Funktion müssen gleich noch implementieren.
Wenn das zutrifft, dann:
Erstellen wir eine For-Schleife die uns durch das Array PickUps begleitet:
Es wird dann abgefragt, ob wir auf einem Pickup gestanden haben, was einen Teleporter da stellt: -
Kannst es auch so machen.
forward DestroyingCars(vehicleid);
public DestroyingCars(vehicleid);
{
DestroyVehicle(vehicleid);
}Und das beim Menü adden:
case 0:
{
GameTextForPlayer(playerid,"Zr gekauft!(60min) (-25.000$)",3000,3);
GivePlayerMoney(playerid,-25000);new vehicleid = CreateVehicle(477,736.7525,-1333.3210,13.2965,229.6027,1,1,200);
SetTimerEx("DestroyingCars",1800000,0,"d",vehicleid);
}usw.
}
[/pwn]
-
Das muss unter OnPlayerStateChange o_O
-
Vielleicht solltet ihr warten, wenn ihr nicht mit der From von API's und deren Sinn zurecht kommt.
-
Nette Sache
-
Och Flippie.
Geht doch viel einfacher.
OnPlayerStateChangeif(oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_ON_FOOT)
{if(OldSkin[playerid] != 0)
{
SetPlayerSkin(playerid,OldSkin[playerid]);
OldSkin[playerid] = 0;}
}
-
zeig mal onplayerexitvehicle
-
new oldskin bringt rein garnicht, höchstens du hast keine User/Freunde und spielst alleine aufnem Home-Server.
Das Oben ins Script
new OldSkin[MAX_PLAYERS];Das bei OnPlayerConnect
OldSkin[playerid] = 0;Das Bei OnPlayerStateChange, also wo du es bereits hast:
new carmodel4 = GetVehicleModel(GetPlayerVehicleID(playerid));
if(carmodel4 == 522 || carmodel4 == 521)
{
OldSkin[playerid] = GetPlayerSkin(playerid);
SetPlayerSkin(playerid,100);
}Das bei OnPlayerExitVehicle:
new carmodel4 = GetVehicleModel(vehicleid);
if(carmodel4 == 522 || carmodel4 == 521)
{
SetPlayerSkin(playerid,OldSkin[playerid]);
OldSkin[playerid] = 0;
}