Guten Morgen
Da ich ma wieder etwas Langeweile habe, zeige/erkläre ich euch, wie ihr einfach und codesparend Interiors erstellt.
Was Benötigt ihr?
etwas erfahrung
Coordinaten von den eingang/ausgang des Interiors
ein Script
als erstes brauchen wir ein #define, da die Interiors nach ID aufgelistet werden und auch eine Zuordnug benötigen
Wie ihr ein define erstellt brauch ich ja nicht erklären aber ich mach hier mal ein Muster hin:
#define MAX_INTERIORS 1
Ich habe da jetzt eine 1 hingeschrieben, da ich als erstes 1 Testinterior verwenden werde
WICHTIG! wenn ihr 10 Interiors in der liste habt undbedingt den define darauf anpassen!!
So wir haben jetzt den define da
als nächstes benötigen wir ein Enum dazu
In den Enum werden dann die Floats und Labels bestimmt
Enum was das ist sollten einige wissen aber ich erklärs so gut ich weiß
Ein Enum ist sowas wie eine Deklairung
man Speichert in den Werten von den enum was ein sagen wir spieler so alles hat
in den fall halt die daten für die interiors
ich mach wieder ein Muster Beispiel:
enum InteriorEnum
{
Float:enterX,
Float:enterY,
Float:enterZ,
Float:exitX,
Float:exitY,
Float:exitZ,
InteriorID,
InteriorVirtualWorld,
InteriorLabel[40]
}
so hier stehen jetzt einige dinge drin
kein Problem ich sag euch eben was was ist
enterX-Z sind die Coordinaten wo der eingang eines Interiors ist.
exitX-Z sind die Coordinaten von den Ausgang eines Interior
InteriorID sollte klar sein die interiorid des interiors
InteriorVirtualWorld wenn ihr das Interior mehrmals verwenden wollt nutzt einfach die Virtualworld ansonsten auf 0 lassen
InteriorLabel[40] Legt einen Text fest der 40 Zeichen haben darf
So da haben wir das Grundgerüst jetzt fangen wir an mit den Setzen das ist aber auch nicht schwer zu machen
wir brauchen eine Deklairung wo wir die interiors setzen
deklairung = in den meisten fällen ein new:
Ich zeig es euch mal
new IntInt[MAX_INTERIORS][InteriorEnum]=
Ihr seht da steht der define und der Enum wieder mit drin
das ist ja auch der sinn jetzt hier bei
Aber wie setzen wir jetzt ein Interior darin?
Ganz einfach ihr macht erstmal die deklairung zuende:
das sollte dann so enden:
new IntInt[MAX_INTERIORS][InteriorEnum]=
{
};
wenn ihr es jetzt Compilt dann erscheinen fehler
diese beheben wir im näschten schritt
jetzt geht es darum das interior zu setzen:
Ich machs mal so, das ich einfach eins hier nehme und es etwas erkläre was ich aber hoffentlich nicht brauch
{-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"}
so das währe jetzt was was wir eintragen können
die reinfolge der coordinaten sind ja oben nach den enum
erst enterX dann enterY dann enterZ als näschtes dann exitX, exitY, exitZ, dann kommt die interiorID, dann die Virtualworld und dann der text der Später am eingang steht
wenn ihr das eingefügt habt sollte es jetzt so aussehen:
new IntInt[MAX_INTERIORS][InteriorEnum]=
{
{-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"}
};
wenn ihr darunter ein neues erstellt MÜSST ihr es mit einen , am ende haben sprich so als Muster:
new IntInt[MAX_INTERIORS][InteriorEnum]=
{
{-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"},//Hier das Komma
{-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"} //Hier nicht da es das letzte is
};
also der letzte wert darf KEIN komma am ende haben!
wenn ihr es jetzt compilt, dann sagt er euch das IntInt nicht verwendet wird
das ist auch richtig, da wir es nicht angewendet haben
als Näschten gehen wir zu OnGameModeInit
denn da erstellen wir jetzt das Pickup und den 3D Text.
Ich mach es jetzt fertig rein, denn ich weiß jetzt, das viele sich da errors reinjagen ohne ende
so sollte es sein:
for(new g;g<MAX_INTERIORS;g++)
{
CreatePickup(1239,1,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ],0);
Create3DTextLabel(IntInt[g][InteriorLabel],FARBE,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ],10.0,0,1);
CreatePickup(1239,1,IntInt[g][exitX],IntInt[g][exitY],IntInt[g][exitZ],0);
Create3DTextLabel("Ausgang",FARBE,IntInt[g][exitX],IntInt[g][exitY],IntInt[g][exitZ],10.0,0,1);
}
hier werden jetzt nur die Pickups und Labels erstellt
wenn ihr das eingefügt habt, und das script neu Compilt, sollte es fehlerfrei seinwenn ihr dan im Spiel guckt, werdet ihr merken das es die Pickups und Labels gibt
aber wenn ihr dahin geht passiert nix
kein Wunder wir haben es ja auch noch nicht festgelegt
das ist unser nächster schritt.
wir gehen jetzt irgendwo hin wo nix ist, denn wir erstellen jetzt 2 neue stocks
einmal für den enter und für den exit punkt zu finden, denn wir wollen ja auch das richtige interior haben
gut wenn ihr eine stelle habt dann macht mal das erstmal rein:
stock GetInteriorEnter(playerid)
{
return -1;
}
hier seht ihr eine Funktion die -1 returnt ist
wiso?
Die erste Interior id ist 0 da Pawn ab 0 Zählt und wenn er an keinen punkt ist von einen Interior soll ja nix passieren
daher -1 da -1 nicht als interior ID gilt.
als näschtes machen wir ne schleife die durch alle interiors geht (der define)
und fragen ab in welchen Punkt er ist
das sollte so sein:
stock GetInteriorEnter(playerid)
{
for(new g;g<MAX_INTERIORS;g++)
{
if(IsPlayerInRangeOfPoint(playerid,1.0,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ]))
{
return g;
}
}
return -1;
}
wenn er in den Punkt ist returnt es g
wiso?
g gibt die ID des interiors aus und stzt den dann später in das richtige Interior
den 2. stock machen wir vom Prinzip genau so
Ich brauch es jetzt eigendlich nicht erklären, denn das einzigste was da anders ist, sind die coordinaten und die Virtualworld
aber so sollte es mal aussehen:
stock GetInteriorExit(playerid)
{
for(new g;g<MAX_INTERIORS;g++)
{
if((IsPlayerInRangeOfPoint(playerid,2.9,IntInt[g][exitX],IntInt[g][exitY],IntInt[g][exitZ]))&&(GetPlayerVirtualWorld(playerid)==IntInt[g][InteriorVirtualWorld]))
{
return g;
}
}
return -1;
}
seht ihr ist fast das selbe wie oben
so das waren die 2 stocks die wir brauchten
jetzt gehen wir mal zu:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
in den Public werden die Tasten angewendet hier für uns nehmen wir mal die Taste Enter oder Taste F
die haben beide die newkeys id 16.
in den public werden wir jetzt den Key abfragen das so sein soll/muss:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & 16)
{
}
return 1;
}
so das ist die Taste enter/f
jetzt werden wir eine deklairung darein setzen, um die stocks aufzurufen
so schaut die dann aus:
new player = GetInteriorEnter(playerid);
hier speichern wir die Interior ID Zwischen
um den spieler gleich richtig zu setten.
jetzt fragen wir ab ob die player id nicht -1 ist das sollte so sein:
if(player!=-1)
so !=-1 sprich wenn es 0 ist geht es ist es -1 geht es nicht
so jetzt ist es nurnoch den player setten das aber jeder wissen sollte
so soll es aussehen dann mit den enter Punkt:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & 16)
{
new player = GetInteriorEnter(playerid);
if(player!=-1)
{
SetPlayerPos(playerid,IntInt[player][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
SetPlayerInterior(playerid,enteEnte[chid][InteriorID]);
SetPlayerVirtualWorld(playerid,IntInt[player][InteriorVirtualWorld])
}
}
return 1;
}
ihr seht, er kommt an die interior pos/id/virtualworld
ihr könnt es wieder compilen und testen ihr kommt zwar rein aber nicht raus
nach der 2 klammer über den return 1 im muster, machen wir ein enter und machen das darein:
player = GetInteriorExit(playerid);
auch hier speichern wir die id zwischen um den da raus zu holen
so hier ist es das selbe wie oben erklärt, deswegen schreib ich darüber nix, denn wir setzen den an den Punkt wo der Pickup ist am eingang und setzen die
interior id und virtualworld wieder auf 0
so sollte das dann sein:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & 16)
{
new player = GetInteriorEnter(playerid);
if(player!=-1)
{
SetPlayerPos(playerid,IntInt[player][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
SetPlayerInterior(playerid,enteEnte[chid][InteriorID]);
SetPlayerVirtualWorld(playerid,IntInt[player][InteriorVirtualWorld])
}
player = GetInteriorExit(playerid);
if(player!=-1)
{
SetPlayerPos(playerid,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ]);
SetPlayerInterior(playerid,0);
SetPlayerVirtualWorld(playerid,0)
}
}
return 1;
}
wenn ihr es jetzt compilt, dann sollten keine Fehler kommen und ihr habt ein einfaches Interiorsystem
Ich nutze diese variante gerne, da es einfach übersichtlicher ist und dadurch spammt man OnGameModeInit nicht so zu, indem
ihr da für 20 Interiors 40 Pickups verwendet
hier sind es lediglich nur 7 einträge bei OnGameModeInit und ihr habt oben nur die deklairung für die Interiors
So ich hoffe, das ich euch helfen konnte und bin für Feedbacks und hilfen gerne bereit zu helfen
MFG
und viel erfolgt wünscht euch
Chris. aka RedJoker