Morsche
Ich "suche" eine Liste sämtlicher oder der meisten (oder wenigstens überhaupt welche) Befehlen.
Für die, die net genau wissen welche ich meine:
AI (Im Ordner AIData): Die KI der Gegner...
NCD (Im Ordner NCDFiles): Die Dialoge der NPCs
wos (im Ordner worldobjectscripts): Das Script für die Interaktion mit bestimmten Objekten
*server.ini (im Root Verzeichnis): die 3 Konfigurationsdateien des Char, login und world servers
Da ich sehr bezweifle das irgendjemand solch eine Liste parat hat, versuch ich einfach in dem Thread eben alle bekannten Befehle aufzulisten...
Wäre also dankbar, wenn ihr mir helfen würdet und ergänzt.
Hier also das, welches ich bereits selber weiß:
AI - Künstliche Intelligenz
Beispiel (ein von mir gemoddetes Aibatt...):
Das Aibatt greift an und spawnt mit einer Wahrwscheinlichkeit von 50% 5 Clockworks. Außerdem bewegt sich das Aibatt zu einem bestimmten Loot (oder unbestimmt?)
Die mir bisher bekannten Standartstruktur...
Ich nehme an,dass #Data Diesen Befehl gibt es nur bei den Serverfiles von Caali, im Client gibt es den nicht (siehe unten). Ich bin mir nicht sicher, ob der Befehl überhaupt irgendwelche Aktionen ausführt, aber ich bezweifle es. Falls doch, dann nur einige, wenige, bestimmte.
Der Befehl #scan ist dazu da, das das Mop nach bestimmten Spieler "scant". Das heißt, er sucht seine Umgebung nach einen Spieler ab, der bestimmte kriterien erfüllt. Ist ein solcher Spieler vorhanden, wird er automatisch angegriffen, selbst wenn das Mop NICHT aggro ist.
#battle kann sich jeder wohl denken... In der Klammer dort wird aufgelistet, wie sich das Monster bei einem Kampf verhalten soll
#move ist auch leicht zu verstehen. Das mop bewegt sich dann ganz einfach zu dem jeweiligen objekt... vlt kann man coords angeben, oder irgendwie die Spieler ID... wahrscheinlich, kann ich aber nicht sagen
#scan
Scan jon (jobNum) range (num) quest (QuestID) item (ItemID) chao (100,101) s ist ein etwask omplitziert aufgebauter Befel... Ich bin mir nicht sicher, aber ich glaube man kann den auch aufteilen. Allerdings solltet ihr das erst einmal selber testen, denn bis ich dazu komme wirds noch etwas dauern. Nun zu den einzelnen Variablen in den Klammern: jobNum steht logischerweise für die Job ID, welcher ein Spieler haben muss, damit das Mop drauf reagiert. Weiß nicht ob man mehrere reinschreiben kann und vorallem wie. Testet es einfach mal aus. num steht logischerweise für die Reichweite, welche er abscant. Ich denke mal, die Reichweite beträgt eine Koordinate (ja, dieses Wort gibt es). QuestID steht ja dann wohl für die Quest ID welche der Spieler haben muss, um angegriffen zu werden. Wie ihr dieser herausbekommt? Schaut in den Server Files nach! Das gleiche wie bei QuestID und jobNum gilt auch für die ItemID. Hier scant das Mop nach einem bestimmten Item, welcher der Spieler mit sich trägt. Bei chao bin ich mir malwieder nicht ganz sicher... Ich vermute es bedeutet, ob er danach sucht, das der Spieler negatives Karma hat ("Chao Guardian").
#battle
Attack (X) cunning (Hi,sam,low): Logischerweise steht es dafür, das es Angreift. Ich bin mir zwar nicht sicher, aber einige Monster brauchen den "Attack"-Befehl nicht, um angreifen zu können. Z.B. ist beim Offi-Server für Small Boos kein Befehl unter #battle registriert. cunning muss man nicht zwangsweise reinschreiben. Wofür aber die Befehle (X), cunning und (Hi,sam,low) stehen kann ich leider nicht sagen. Ich weiß nur, dass (X) für eine Zahl steht (wahrscheinlich für einen prozentualen Effekt) und das man sich eines von den, in der Klammer stehenden Befehlen aussuchen soll, bei (Hi,sam,low)
Berserk XX Y: X steht für den prozentsatz der HP welches das monster maximal haben darf um in den berserk mode zu gehen... dabei wird der schaten um den faktor von Y erhöht (oder gegebenfalls gesenkt wenn man das will...)
summon XX Y ZZZ: Damit spawnt der Gegner ein anderes Mop. X steht für die wahrscheinlichkeit (100 ist dann sofort) (wahrschenlich in %), Y für die anzahl und Z für die Monster ID. Solange ein gespawnter gegner noch lebt, werden keine neuen gespawnt.
recovery XX YY ZZZ m: Selfheal. X steht für den Prozentsatz seiner HP welcher unterboten werden muss, damit sich das Mop healt. Y steht für den Prozentsatz auf welche die HP dann aufgestockt werden soll. Z bin ich mir nicht sicher, aber ich glaube es steht für die wahrscheinlichkeit. m kann man genauso gut durch u und a ersetzen. Der Unterschied ist mir nicht bekannt.
Keeprangeattack (Range) ist dafür da, dass das Mop versucht auf Distanz zu bleiben und mit Fernangriffen "zuschlägt". (Range) steht für die Entfernung
Rangeattack (X) ist wieder son gammliger Befehl, mit welchem ich nicht viel zu anfangen weiß. (X) steht logischerweise für eine Zahl.
Evade (X) steht für die Missrate der, auf das Aibatt gerichtete, Attacken mit einer Prozentualen Bedeutung.
Helper (freq) (sr) (num) (mtype): Ich bin gnadenlos überfragt...
Randomtarget Á¦ÀϸÕÀú ¾²ÀÌ´Â °æ¿ì »ç¿ë: Ich habe weder Ahnung ob Á¦ÀϸÕÀú ¾²ÀÌ´Â °æ¿ì »ç¿ë irgendeine Bedeutung hat, bzw wichtig für den Befehl ist (das steht jedenfalls in der Datei vom Client drin), noch was eigentlich der gesamte Befehl bewirken sollte.
#move
Loot (d) (X,Y) (code) (?): Das Mop bewegt sich zu einem bestimmten, auf dem Boden liegendem Item und hebt dieses auf. Allerdings versteh ich das nicht so recht...
teleport (freq) (X,Y or 1~5) (mana) (batt):
Noch so ein Befehl, welcher mir völlig schleierhaft ist.
Und um noch einmal zurück auf den Client zu sprechen: Die AIDatas des Servers beinhalten NICHT alle Befehle, welche im Client registriert worden sind. Ich zeige euch mal ein Beispiel:
Alles anzeigen
Wie ihr seht, steht auch vor AI noch etwas anderes. Unter anderem die Drops, Anzahl der Drops und Penyas. Leider funktioniert das, aus irgendwelchen Gründen, nicht in der AIData des Servers. Ihr müsst also nach wie vor die Drops per DropData definieren. Was allerdings für uns interessant ist, sind die Befehle, die darunter stehen. Und zwar z.B. m_dwAttackMoveDelay = 2000;. Ihr habt diese Befehe vielleicht schon einmal in de AIDatas gesehen unter #Data. Allerdings, wie bereits schon gesagt, glaube ich nicht, das die dort eingetragenen Befehle eine Wirkung haben. Zumindestens wahrscheinlich nicht alle. Ich liste nun all diese Befehle auf, welche im Client eingetragen sind:
Maxitem = X: Steht für die Anzahl der Items, welches ein Monster MAXIMAL auf einmal droppt (Questis und Food inbegriffen, allerdings kein Money).
DropItem(II_GEN_GEM_GEM_TWINKLESTONE, 300000000, 0, 1) ist ganz klar für ein Item, welches dieses Monster droppen kann. Die erste Zahl steht für die Wahrscheinlichkeit, die letzte für die Anzahl der Drops. Ich habe keine Ahnung wofür das 2. steht. Glaube aber z.B. für das + Bei Ringen (z.B. hat CW 9, 15 und 18 bei den Ringen)
DropGold(Min, Max): ist wohl eindeutig, oder?
QuestItem: Ich habe überhaupt keine Ahnung. Kein Monster hat solch einen Befehl. Und auch keine wirklich lesbare Beschreibung ist vorhanden. Ihr könnt ja mal versuchen, ob ihr etwas herausfindet, allerdings müsste es schwer werden, da ihr auch die Variablen nicht kennt, welche ihr dort angeben könntet/müsstet.
m_dwAttackMoveDelay = 0: I have no plan. You should ask someone else. P.S.: Small Aibatt und Small Mushpang sind die einzigen Mops, die einen m_dwAttackMoveDelay = 2000 haben. Ansonsten haben die ein oder anderen Mops noch einen von 0.
m_dwRunawayDelay = 1000: Hab ich genauso wenig Ahnung von.
SetRunAway( 10, MI_DORIDOMA1, 2 ): Dies bewirkt, das der Gegner sich ab einer bestimmten HP Rate vom Spieler abwendet. 10 steht in diesem Fall für die % Rate der HP, welche unterboten werden muss. MI_DORIDOMA1 glaub ist, ist ein Mop, zu welches sich das fliehende Monster hinbewegen würde... Allerdings kann ich keien Garantie geen! Man kann es auch durch 0 ersetzen. wofür die 2 wieder steht hab ich malwieder (...) keinen blassen schimmer.
SetCallHelper( 100, MI_NUCTUVEHICLE2, 5, TRUE): Hier wirds wieder Komplitziert. Ich kann euch nicht sagen, was dieser Befehl eigentlich bewirken soll... Ich kann nur soviel sagen, das 100 für irgendwelche HP in % steht. MI_NUCTUVEHICLE2 wohl für die Gegner, welche er "um Hilfe ruft", 5 nehme ich ma an für die Anzahl und das TRUE (oder FALSE) steht, laut beschreibung, für "bParty"... Allerdings was das genau heißen soll/welche Bedeutung das nun letzendlich hat, kann ich nicht sagen... Sorry Guys, kann euch malwieder net helfen :P
m_nAttackFirstRange = 10: Ich bin zwar nicht sicher, aber vielleicht die Entfernung des Ersten Angriffs des Gegners, welches eine Fernattacke ist. Ihr kennt doch einige Gegner. Erst einmal Fernkampfangriff gemacht und dann zu euch hergerannt und nur noch Nahkampf. Allerdings geb ich wieder keine Garantie...
DropKind(IK3_SUIT, 6, 13): Ich hab den Befehl nicht wirklich verstanden, bzw ich kann ihn nicht nachvollziehen (is auch doof, wenn man all das ja net testen kann! Caali Files FTL. Kann euch nicht wirklich viel zu den Variablen erzählen, lediglich das IK3_SUIT wohl für eine Suit stehen würde... Aber darauf wärt ihr wohl selbst gekommen, oder? ^^
DropEvenitem: Fehlt wieder jegliche Beschreibung im Spiel. Ich müsste schon hellsehen um das zu verstehen.
DropQuestItem(): Is mir ebenso vorenthalten, wie schon bereits ein paar andere Befehle.
P.S.: Die // dienen dazu, das der Befehl keine Wirkung hat. mit anderen Worten: Das Evade des Aibatts funktioniert nicht, weil es von den GMs aus irgendeinem Grund rausgenommen wurde. Das Spiel würde also so fortfahren, als würde es den Befehl nicht geben. Ist praktisch, wenn man mal vorrübergehend einen Befehl deaktivieren will, aber ihn nicht gleich löschen will, um ihn später wieder einzutragen. Das Funktioniert auch beim Trade Code und den anderen!
Dropwahrscheinlichkeit
Alles anzeigen
Die 1. Zahl steht für die Zahl, welch du dann eintragen müsstest.
Die 2. für den Prozentsatz
Die 3. weiß ich nicht genau den nutzen von... 100% steht für 1. Und wenn du dann 10% davon nehmen wilslt, rechnest du es rückwärts. So ergebe 10% 10 und 1% 100. Mit anderen Worten: die Zahl, welche du die % oder Wahrscheinlichkeit mal nehmen musst, um wieder 100% Dropchance zu erreichen.
Wie berechne ich nun aus, welche Zahl ich für einen bestimmten Prozentsatz ich nehmen soll?
Leute, das ist einfaches Mathe... aber ich erklärs nomma:
Wenn man z.B. 5% haben will,
schnappt man sich die Zahl von einem gescheiten Prozentsatz. Z.B. nehmen wir nun einach mal das von 1%, weil es am einfachsten zu rechnen ist (OK, 10% wäre vlt einfacher.. egal). Dort haben wir die Zahl 30000000 (30.000.000 - 30Millionen - 3*10^8).Dann rechnest die 30000000 mal 5. Das würde dann 150000000 ergeben (150.000.000 - 150Millionen - 15*10^7).
NCD - Non-character dialoge? kA^^
Beispiel (Achaben aus Darkon):
Alles anzeigen
Dieser NPC spricht ein paar unwichtige sätze un hat insgesammt 3 aktionen zur verfügung welche man auswählen kann. eine davon ist, das fenster wieder zu schließen
Aufbau:
bestimmte, festgelegte Eigenschaften oder Aktionen die der NPC hat oder machen soll.
Z.B. bei diesem hier werden in den sprechblasen, die ein NPC manchmal von sich gibt einer dieser 3 texte stehen. Aber es gibt auch andere befehle die man einfügen könnte.
Hier wird bestimmt was getan und gesagt werden soll wenn du den NPC ansprichst
in diesem fall werden alle buttons entfernt, der text "hello *name des spielers* eingeblendet
und die buttons "Bye" und "Introduction" hinzugefügt.
Hier wird also dann festgelegt was gemacht werden soll wenn man au den Butten "introduction" klickt.
Das sind im groben die 3 teile aus denen der NPC "besteht".
nun kommen wir aber zu der beschreibung der befehle:
AddNPCChat( "Text" );
der in den " stehende text wird ab und an in form von einer sprechblase, die der NPC manchmal von sich gibt angezeigt.
AddText( "Text" );
Mit diesem Befehl wird sofort und einmalig eine Sprechblase erzeugt mit dem darin enthaltenen text.
AddTextButton( "Morsche" );
Erstellt einen Button mit der aufschrit Morsche. Dies dient zur interaktion mit dem NPC.
RemoveAllTextButtons( );
Entfernt alle momentan vorhandenen TextButtons. ratsam dies in jeder neuen befehlszeile zu schreiben. und vorallem: bevor man neue buttons erstellt^^
AddText( "Hallo du kleiner Zwerg!" );
Zeigt dann im Dialogfenster des NPCs den Text mit der aufschrift Hallo du kleiner Zwerg an.
SetNPCEquipment( 6, 751 );
gibt dem NPC ein bestimmtes Equipment. in diesem Falle einen RoyalBluemoon helmet. Die 6 steht in diesem Fall für die Parts. Z.B. hat das Red Dress Helmet das Part 26. Ihr könnt das ganz einfach in eurer DB eintragen. Wenn Part und Item ID nicht stimmen, dann funkst es auch net. Man kann auch ihnen eine Waffe geben.
VORSICHT: ich glaube es geht nur, wenn der NPC ein das model eines spielers hat. Wenn dies der fall ist. sollte man diesen Befehl möglichst bei der Data Befehlsleiste einfügen, ansonsten is der NPC nackt^^. und wenn möglich auch die klamotten passend zum gechlecht... sonst siehts etwas komisch aus :P
P.S.: Der Befehl funktioniert glaub ich nur unter der Data Befehlsleiste.. ansonsten kommt bei meiner Worldserver.exe eine Fehlermeldung:
CNCDParser: :ExecuteBlock -> Unrecognized command "SetNPCEquipment"!
Could not execute the NPC Speech file for MaDa_Laloa with arguments Red Dress Klamotten ! ErrorCode: 5
vlt kann jemand was mit dem Fehlercode anfangen :P
Codes für die texte:
%PLAYERNAME% - Zeigt den spielernamen an
/" - zeigt ein " an
Info: ich nehme an das man mit / auch andere sonderzeichen zeigen lassen kann... un ich weiß net ob umlaute aus dem deutschen funktionieren
ich nehms einfach ma an^^
Für die, die rev 2 nutzen gibt es aber andere Files als NCDs. Sie sind zwar komplitzierter, aber weitaus besser, weil man da mehr Möglichkeiten besitzt. Diese werden mal hier beschrieben:
Alles anzeigen
Aufbau: gleich, mit nur einem zusätzlichen Eintrag:
In dieser Zeile wird festgelegt was passieren soll wenn auf einen Button geklickt wird.
Nun zur Erläuterung:
math.randomseed( os.time() )
Is mir Ungewiss... steht aber bei jedem dabei, also iwas wichtiges. Ich nehme mal an, irgendwas für für den zufälligen Interval des untenstehenden Befehls.
nps_SetNPCChatInterval(math.random(10000,20000))
Die Zeit zwichen den Sprechblasen des NPCs. In diesem Fall ist es eine zufällige Zahl zwichen 10000ms und 20000ms.
nps_AddNPCChat( "There are so many flowers today! And they look so beautiful!" );
Der Text, welcher in den Sprechblasen angezeigt werden soll.
nps_SetNPCEquipment("PARTS_FOOT","II_ARM_F_MAG_BOOTS08")
Gibt deinem NPC Klamotten und anderen Müll^^ "PARTS_FOOT" steht für das Teil, welches er tragen soll und "II_ARM_F_MAG_BOOTS08" für das Item, welcher er tragen soll. Leider geht es nun net mehr über item ID und Partnummer... schade eigentlich, aber solange es irgendwie noch geht isses in Ordnung.
nps_SetNPCEyeStyle(2)
Legt fest, welches Face der NPC haben soll.
nps_SetNPCHairStyle(0)
Das gleiche wie beim Face, nur für die Frisi
nps_SetNPCHairColor(0xFF080808)
Und das gleiche nomma für die Haarfarbe
return 1
Wofür das return steht hab ich leider auch keine wirkliche Ahnung...
nps_RemoveAllTextButtons( )
Das gleiche wie schon bei den NCDFiles... terminiert alle Buttons.
nps_AddText( nps_GetString("IDS_MADA_LALOA_OPEN_WINDOW_TEXT") )
Fügt den Thread, welcher für die Variable "[COLOR]IDS_Mada_LALOA_OPEN_WINDOW_TEXT" gespeichert worden ist. Die Datei in welcher diese Variable gespeichert worden ist findet man unter dem Ordner "Language\en_en\NPSFiles"
nps_AddTextButton( nps_GetString("IDS_MADA_LALOA_TB_INTRODUCTION"), "BUTTON_INTRODUCTION" )
Er erstellt einen Button und legt die Variable "BUTTON_INTRODUCTION" für ihn fest. Die Beschriftung des Buttons lädt er von der Variable "IDS_MADA_LALOA_TB_INTRODUCTION"
nps_CloseWindow( )
Schließt das Fenster^^
nps_NPCChat( "Have a nice day!" )
Erstellt eine Sprechblase mit dem Text "Have a nice day!"
nps_AddNPCChat( "There are so many flowers today! And they look so beautiful!" );
Legt fest, dass einer der Sprechblasen, welche der NPC von sich gibt, folgenden Text beinhaltet.
wos - world object scripts
des hier ist glaub ich das komplitzierteste von allen...
zumindestens wenn man etwas größeres damit basteln will
die wos werden aktiviert, sobald man ein objekt benutzt, welches man in der datenbank unter der tabelle spawns_worldobjects eingetragen hat. welches script bei welchem objekt verwendet werden soll, kann man ebenfalls in der DB einstellen
Das beste beispiel ist wohl der masdungeon (serus uriel box):
Alles anzeigen
daaaaaaaaaaann fangen wir mal an.. stückchenweise:
dwMobChance = math.random(0,100)
szMobName = ""
dwMobCount = 0
bSpecial = 0
das sind variablen die festgelegt werden...
wobei man bei ersteren sagen muss, das die "festgelegte" variable eine zufällige mathematische zahl (integer - also nur ganze zahlen) zwichen 0 un 100 ist. beim 2. existiert keine und bei den anderen 2 sind die variablen eben 0^^
Alles anzeigen
das ist eine ganz einfache if abfrage..
im grunde sagt sie aus:
wenn die variable von dwMobChance (welche ja oben per zufall festgelegt worden ist) kleiner als 30 ist, dann ist die variable für szMobname gleich "MI_VICEVEDUQUE" und die variable für dwMobCount wäre dann 5. falls dies aber nicht der fall ist, wird überprüt ob die variable kleiner ist als 70. das geht also immer so weiter bis die if abfrage fertig ist. wenn dann entweder die variable der dwMobChance zutreffend für eines der abfragen ist, oder wenn alle abfragen "ungültig" sind und demnach dann das letzte (also serus uriel) ausgeführt wird, endet die abfrage. das heißt also, wenn z.B. die zahl kleiner als 30 ist, führt er die anderen i abfragen nicht durch.
das überprüft ob die variable bSpecial 1 ist. dies ist nur dann der fall, wenn die 3 ersteren if abfragen ungültig waren und somit serus uriel gespawnt worden ist. wenn also dies der fall ist, dann spawnt er ein monster mit dem namen, welche für die variable szMobName festeegt worden ist, in der umgebung des objektes. wofür genau die 3 variablen (100, 2 und 1) stehen weiß ich net genau.. ich kann nur sagen, das 1 wohl für dei mopanzahl steht.
Danach führt das jeweilige objekt eine animation aus (in der klammer könnte man vlt etwas festlegen, aber ich hab keine ahnung was). und das objekt wird dann ür 1 minute lang "unsichtbar"... bzw mehr oder weniger nicht existent und spawnt nach einer min wieder neu.
THX an Darkdevil1 für die Erläuterung des Befehls:
Spawnt ein Monster, welches in der Variable szMobName vorher gespeichert worden ist, mit der Anzahl, die in dwMobCount gespeichert worden ist. Aggro Chance beträgt 100%, Radius des Kreises, in welchem es gespawnt wird beträgt 2 und die 1 steht für die Größe des Monsters.
Ebenso wird die ID des gespawnten Monsters über eine If-Schleife überprüft. Sollte die ID ungleich 0 sein, so führt das wos folgende Befehle aus:
Das WO führt eine Animation aus (in diesem Fall öffnet sich die Truhe)
Die Truhe wird für eine Minute lang "unsichtbar" (für den Spieler praktisch nicht existent)
Das/die Monster setzen einen Skill ein, welcher den Namen "SI_GEN_STUNGROUP" trägt und lvl 5 beträgt.
befehlserleuterung:
wos_GetClientLevel(X)
X = das Level, auf welches der Spieler gesetzt werden soll
Oder die Anzahl der lvl ups?
wos_GetClientEXP(X)
X = die EXP, welche der Spieler bekommt
wos_GetClientAccessLevel(X)
X = das Acces Level, auf welches der Spieler gesetzt wird (1000 = GM, 100 = normaler Spieler)
wos_GetClientGender(X)
X = Das geschlecht auf welches er gesetzt wird.
1 = weiblich
2 = männlich? (oder war male 0? weiß nemmer)
wos_GetClientPenya(X)
X = Anzahl der Penya die der Spieler bekommt, oder auf welches seine Penyas gesetzt werden?
wos_HasClientItemInInventory("II_SYS_SYS_KEY_DKDUIDCARD",1)
Überprüft ob der Spieler das Item DKDUIDCARD besitzt. Wird soweit ich weiß nur in if-Schleifen verwendet oder?
Z.B.
if wos_HasClientItemInInventory("II_SYS_SYS_KEY_DKDUIDCARD",1) ~= 0 then
überprüft die anzahl des Items. Die if-schleife wird erst aktiv, wenn die Anzahl NICHT 0 beträgt (also größer als 0... oder weniger als null.. aber man kann net weniger items haben als 0 :P )
wos_ClientSendDefinedText("ZZZ")
ZZZ steht für den Text, welcher der Client in form von einer noramlen Chatnachricht von sich gibt, kann das sein? Müssen dann auch " gesetzt werden?
wos_TeleportClientWorld(X,Y,Z)
Teleportiert den Spieler an folgende Koordinaten.
wos_TeleportClientWorld("WI_DUNGEON_DA_DK",745,85,780)
Teleportiert den Spieler in die World, mitsamt den Koordinaten.
wos_RemoveItemFromClientInventory("II_SYS_SYS_KEY_DKDUIDCARD",1)
Terminiert ein bestimmtes Item, welches sich im Inventar des Spielers befindet. In diesem Falle 1 mal das Item DKDUIDCARD
wos_SpawnMonstersInCircle(M,N,A,E,G)
M = Name des Monsters
N = Anzahl der zu spawnenden Monster
A = Aggro Chance in %
E = Entfernung, bzw Radius des Kreises in welchem er gespawnt wird
G = Größe des Monsters
Spawnt also ein Monster in einem Bestimmten Kreis mit den Oben stehenden Variablen
wos_SetInvisibleWithTimeout(X)
Macht das WorldObject für eine bestimmte anzahl von millisekunden "unsichtbar" und demnach im grunde nicht existenz für den Spieler
wos_ShowWorldObjectAnimation()
Spielt die Animation des WO ab.. was allerdings kommt in die Klammer rein? bzw könnte
wos_ShowOtherWorldObjectAnimation(X)
Spielt die Animation des WOs ab, welches die ID in der Klammer besitzt (wird in der DB festgelegt)
wos_ShowSfxOnClient()
Spielt einen bestimmten Effekt an der position deines Charas ab. Allerdings kenn ich die Variablen nicht
wos_ShowSfxOnWorldObject()
Das gleiche wie Oben, allerdings gültig für das WO
wos_MonsterCastSkill(M,S,L)
Lässt ein bestimmtes Monster einen Skill casten
M = Monster ID
S = Name des Skills
L = Skilllevel
Allerdings, wird der Skill dann nur während der Aktivierung des wos einmalig eingesetzt, oder?
das wos ist mit abstand das komplitzierteste aller teile die ich hier aufgelistet habe.. dafür kann man aber auch vieeeeel lustigere sachen damit basteln... Lasst eurer Fantasie freien Lauf!
*server.ini Dateien
login_server.ini
Alles anzeigen
Aufbau:
[server]
Allgemeine einstellungen
[isc]
Erreichungseinstellungen wie port und IP
[mysql]
Einstellungen für die Database
Erklärung:
[server]
ip=localhost
hier wird dann deine Ip eingetragen du du benutzten willst, damit man auf den server connecten kann.. dies kann z.B: deine LAN IP sein (entweder per Lanparty oder wenn du eine statische IP hast), eine umgeleitete IP/domain oder z.B: andere feste IPs wie deine hamachi IP z.B.
Die IP muss dann in der neuz.ini im client eingetragen werden
port=23000
welchen port du benutzen willst.. es empfiehlt sich dies zu belassen, da ich z.B. dies dann auch beim client bearbeiten müsste... und ich weiß net wie
minAccessLevel=0
hier legt man fest, welche rechte ein account haben muss um connecten zu können. die rechte kann man in der DB einstellen
id=1
keine ahnung^^
name=LoginServer
der name? oO also ich hab den bisher ingame nie gesehen :P
use_flyff_a=1
hab ich auch keine ahnung von
Rev_2 Befehle:
data_path=..\Data
Gib an, in welcher der Ordner "data" ist.
log_path=Log
Das gleiche wie oben, nur diesmal für den Log
flyff_a_md5=
Nicht bekannt
owner=1
Ist mit ebenfalls nicht genau bekannt.
[isc]
ip=localhost
Irgendeine IP - kA für was
port=29300
das gleiche gilt hier genauso wie bei der IP
[mysql]
server=localhost
die IP wo die DB gespeichert ist, worauf der server zugreifen soll
database=flyff
name der DB auf welche der server zugreifen soll
username=***
Username für die DB
password=***
Passwort für die DB
char_server.ini
Alles anzeigen
Erklräungen:
ip=localhost
Siehe oben
port=28000
Siehe oben
minAccessLevel=0
Siehe oben
id=2
Siehe oben
owner=1
Siehe oben
name=Sarara
Der name des Servers, in der linken spalte des Serverauswahlmenus. (z.B. Clockwork, Glaphan, Aibatt, Burudeng, etc)
data_path=..\Data
Siehe oben
log_path=Log
Siehe oben
use_gameguard=0
Weiß ich auch nicht so genau, aber ich glaube hier kannst du einstellen ob GG aktiviert sein muss, um drauf zu connecten zu können
gameguard_auth_query_interval=10000
Ist mir nicht bekannt
[isc]
ip=localhost
Siehe oben
port=29300
Siehe oben
[mysql]
server=localhost
Siehe oben
database=flyff
Siehe oben
username=***
Siehe oben
password=***
Siehe oben
world_server.ini
Alles anzeigen
[server]
ip=localhost
siehe oben
port=15400
siehe oben
minAccessLevel=0
siehe oben
id=3
siehe oben
owner=2
siehe oben
channel_number=1
Lege fest, welche Nummer der Channel bekommen soll
name=Reinforce
siehe oben
data_path=..\Data
Siehe oben
log_path=Log
Siehe oben
exprate=1
das spricht doch wohl für sich selbst?^^ halt die normale EXP rate die man bekommt standart ist 1
fxprate=1
das gleiche wie bei der exp rate, nur das dies für die exp fürs fliegen gilt
droprate=1
droprate von den items, welches ein monster nach seinem tod hinterlässt...
penyadroprate=1
Droprate der Penyas oO
questdroprate=1
das gleiche wie bei der droprate, nur halt für questis
motd=Möp se
message of the day - nachricht die angezeigt werden soll, wenn du dich einloggst
welcomemsg=Chibbie
Etwas ähnliches wie motd
weather=2
welches wetter auf dem server beim start sein soll
0 = nichts
1 = regen
2 = schnee
random_weather=0
stellt ein ob das wetter sich ändert
0 = nein
1 = ja
random_weather_interval=0
interval in sekunden, wann sich das wetter wieder ändern soll
can_trade_quest_items=1
zum einstellen ob man questis traden kann
can_drop_quest_items=1
zum einstellen ob man questis traden kann, die man nur bekomtm während ein bestimmter quest aktiv ist
can_player_shop_quest_items=1
ob man questis innem aufgemachten shop anbieten/verkaufen kann
can_mail_quest_items=1
ob man questitems per mail versenden kann
can_guild_bank_quest_items=1
ob man in die gildenbank quest items stopfen kann (maaan das sind zu viele questis einstellungen >.>)
use_item_cooldown=0
ob ein item sich wieder aufladen muss, wenn ma nes eingesetzt hat (z.B. food)
use_item_casting_timers=0
ob man zum einsetzen eines items warten muss (z.B. board oder blinkwing)
use_action_slot_cooldown=0
ob der Action slot "überladen" werden kann und somit nicht voll funktionstüchtig ist oder ob er frei verwendbar ist
guild_rejoin_waiting_time=0
ob man nach dem leaven einer gilde wieder warten muss
#guild_rejoin_waiting_time=172800
die dauer wielange man warten muss um in eien neue guilde zu joinen in sekunden
allowPK=0
Player Kill ein oder aus
allowKS=1
Kill stealing ein oder aus
allowGuildBank=1
Willste ne Gildenbank?
precompile_nps_files=0
Ich glaube das dient dazu da, das von den NPSFiles ne sicherheitskopie gemacht wird, mit der endung .pre hintendran. Allerdings versteh ich nicht genau den Sinn und Zweck, dieser Option.
everywherePVP=1
PvP überall oder nur Duellarena
dice_minigame_min_bet=100
Minimum Gebot, für das Dice Minispiel
dice_minigame_max_bet=100000000
Maximum Gebot, für das Dice Minispiel
dice_minigame_win_factor=5
Der Faktor um wieviel dein gewettetes Geld multiplitziert wird, welches du bei Gewinn erhältst
Information:
Die Serverconfigbefehle basieren auf Caali's Rev_2 Files. Es kann also sein, das einige Befehle für Rev_1 ungültig oder unbrauchbar sind.
Ich hoffe, ich konnte einigen von euch wengistens etwas helfen, und genauso sehr hoffe ich, das andere mir und den Bedürftigen auch helfen, indem sie die Liste erweitern! Wenn die Liste irgendwann doch zu groß werden sollte, werd ich ma überlegen ob ich den Thread vlt dann in mehrere spalte... Aber momentan sind wir ja noch weit davon entfernt (atm gleicht es mehr so einem Tutorial...)
Außerdem, bitte nicht klauen! Wenn jemand das kopieren will und wo anders verbreiten will bitte vorher fragen, oder einfach hier her verlinken! Danke.
P.S.: Auf Wunsch kann ich die Listen auch durch weitere Erweitern. Wenn ihr mir eine Vorlage oder einen Wunsch liefert, kann ich dies auch hinzufügen.
Changelog:
1.11.2008
-Ein, mir unbekannter Befehl beim wos wurde (dank Darkdevil1) erklärt
-Die wos Befehle wurden (dank Darkdevil1) erweitert
-Habe einen weiteren Komentar zum Code des Aibatts bei AIData hinzugefügt
-"Code-Funktion" in meinem Thread verwendet, damit die Befehlszeilen besser zu erkennen sind
31.10.2008
-Extreme Erweiterung aller, vom Client bekannten Befehle für die AI
-Einige Erweiterungen für die Server Configs.
Ein Danke für all jene, die mir geholfen haben die Liste zu erweitern:
Darkdevil1
-Erläuterung eines, mir unverständlichen Befehls beim wos.
-Auflistung sehr vieler wos Befehle
Ich "suche" eine Liste sämtlicher oder der meisten (oder wenigstens überhaupt welche) Befehlen.
Für die, die net genau wissen welche ich meine:
AI (Im Ordner AIData): Die KI der Gegner...
NCD (Im Ordner NCDFiles): Die Dialoge der NPCs
wos (im Ordner worldobjectscripts): Das Script für die Interaktion mit bestimmten Objekten
*server.ini (im Root Verzeichnis): die 3 Konfigurationsdateien des Char, login und world servers
Da ich sehr bezweifle das irgendjemand solch eine Liste parat hat, versuch ich einfach in dem Thread eben alle bekannten Befehle aufzulisten...
Wäre also dankbar, wenn ihr mir helfen würdet und ergänzt.
Hier also das, welches ich bereits selber weiß:
AI - Künstliche Intelligenz
Beispiel (ein von mir gemoddetes Aibatt...):
Ich nehme an,dass #Data Diesen Befehl gibt es nur bei den Serverfiles von Caali, im Client gibt es den nicht (siehe unten). Ich bin mir nicht sicher, ob der Befehl überhaupt irgendwelche Aktionen ausführt, aber ich bezweifle es. Falls doch, dann nur einige, wenige, bestimmte.
Der Befehl #scan ist dazu da, das das Mop nach bestimmten Spieler "scant". Das heißt, er sucht seine Umgebung nach einen Spieler ab, der bestimmte kriterien erfüllt. Ist ein solcher Spieler vorhanden, wird er automatisch angegriffen, selbst wenn das Mop NICHT aggro ist.
#battle kann sich jeder wohl denken... In der Klammer dort wird aufgelistet, wie sich das Monster bei einem Kampf verhalten soll
#move ist auch leicht zu verstehen. Das mop bewegt sich dann ganz einfach zu dem jeweiligen objekt... vlt kann man coords angeben, oder irgendwie die Spieler ID... wahrscheinlich, kann ich aber nicht sagen
#scan
Scan jon (jobNum) range (num) quest (QuestID) item (ItemID) chao (100,101) s ist ein etwask omplitziert aufgebauter Befel... Ich bin mir nicht sicher, aber ich glaube man kann den auch aufteilen. Allerdings solltet ihr das erst einmal selber testen, denn bis ich dazu komme wirds noch etwas dauern. Nun zu den einzelnen Variablen in den Klammern: jobNum steht logischerweise für die Job ID, welcher ein Spieler haben muss, damit das Mop drauf reagiert. Weiß nicht ob man mehrere reinschreiben kann und vorallem wie. Testet es einfach mal aus. num steht logischerweise für die Reichweite, welche er abscant. Ich denke mal, die Reichweite beträgt eine Koordinate (ja, dieses Wort gibt es). QuestID steht ja dann wohl für die Quest ID welche der Spieler haben muss, um angegriffen zu werden. Wie ihr dieser herausbekommt? Schaut in den Server Files nach! Das gleiche wie bei QuestID und jobNum gilt auch für die ItemID. Hier scant das Mop nach einem bestimmten Item, welcher der Spieler mit sich trägt. Bei chao bin ich mir malwieder nicht ganz sicher... Ich vermute es bedeutet, ob er danach sucht, das der Spieler negatives Karma hat ("Chao Guardian").
#battle
Attack (X) cunning (Hi,sam,low): Logischerweise steht es dafür, das es Angreift. Ich bin mir zwar nicht sicher, aber einige Monster brauchen den "Attack"-Befehl nicht, um angreifen zu können. Z.B. ist beim Offi-Server für Small Boos kein Befehl unter #battle registriert. cunning muss man nicht zwangsweise reinschreiben. Wofür aber die Befehle (X), cunning und (Hi,sam,low) stehen kann ich leider nicht sagen. Ich weiß nur, dass (X) für eine Zahl steht (wahrscheinlich für einen prozentualen Effekt) und das man sich eines von den, in der Klammer stehenden Befehlen aussuchen soll, bei (Hi,sam,low)
Berserk XX Y: X steht für den prozentsatz der HP welches das monster maximal haben darf um in den berserk mode zu gehen... dabei wird der schaten um den faktor von Y erhöht (oder gegebenfalls gesenkt wenn man das will...)
summon XX Y ZZZ: Damit spawnt der Gegner ein anderes Mop. X steht für die wahrscheinlichkeit (100 ist dann sofort) (wahrschenlich in %), Y für die anzahl und Z für die Monster ID. Solange ein gespawnter gegner noch lebt, werden keine neuen gespawnt.
recovery XX YY ZZZ m: Selfheal. X steht für den Prozentsatz seiner HP welcher unterboten werden muss, damit sich das Mop healt. Y steht für den Prozentsatz auf welche die HP dann aufgestockt werden soll. Z bin ich mir nicht sicher, aber ich glaube es steht für die wahrscheinlichkeit. m kann man genauso gut durch u und a ersetzen. Der Unterschied ist mir nicht bekannt.
Keeprangeattack (Range) ist dafür da, dass das Mop versucht auf Distanz zu bleiben und mit Fernangriffen "zuschlägt". (Range) steht für die Entfernung
Rangeattack (X) ist wieder son gammliger Befehl, mit welchem ich nicht viel zu anfangen weiß. (X) steht logischerweise für eine Zahl.
Evade (X) steht für die Missrate der, auf das Aibatt gerichtete, Attacken mit einer Prozentualen Bedeutung.
Helper (freq) (sr) (num) (mtype): Ich bin gnadenlos überfragt...
Randomtarget Á¦ÀϸÕÀú ¾²ÀÌ´Â °æ¿ì »ç¿ë: Ich habe weder Ahnung ob Á¦ÀϸÕÀú ¾²ÀÌ´Â °æ¿ì »ç¿ë irgendeine Bedeutung hat, bzw wichtig für den Befehl ist (das steht jedenfalls in der Datei vom Client drin), noch was eigentlich der gesamte Befehl bewirken sollte.
#move
Loot (d) (X,Y) (code) (?): Das Mop bewegt sich zu einem bestimmten, auf dem Boden liegendem Item und hebt dieses auf. Allerdings versteh ich das nicht so recht...
teleport (freq) (X,Y or 1~5) (mana) (batt):
Noch so ein Befehl, welcher mir völlig schleierhaft ist.
Und um noch einmal zurück auf den Client zu sprechen: Die AIDatas des Servers beinhalten NICHT alle Befehle, welche im Client registriert worden sind. Ich zeige euch mal ein Beispiel:
Quellcode
Maxitem = X: Steht für die Anzahl der Items, welches ein Monster MAXIMAL auf einmal droppt (Questis und Food inbegriffen, allerdings kein Money).
DropItem(II_GEN_GEM_GEM_TWINKLESTONE, 300000000, 0, 1) ist ganz klar für ein Item, welches dieses Monster droppen kann. Die erste Zahl steht für die Wahrscheinlichkeit, die letzte für die Anzahl der Drops. Ich habe keine Ahnung wofür das 2. steht. Glaube aber z.B. für das + Bei Ringen (z.B. hat CW 9, 15 und 18 bei den Ringen)
DropGold(Min, Max): ist wohl eindeutig, oder?
QuestItem: Ich habe überhaupt keine Ahnung. Kein Monster hat solch einen Befehl. Und auch keine wirklich lesbare Beschreibung ist vorhanden. Ihr könnt ja mal versuchen, ob ihr etwas herausfindet, allerdings müsste es schwer werden, da ihr auch die Variablen nicht kennt, welche ihr dort angeben könntet/müsstet.
m_dwAttackMoveDelay = 0: I have no plan. You should ask someone else. P.S.: Small Aibatt und Small Mushpang sind die einzigen Mops, die einen m_dwAttackMoveDelay = 2000 haben. Ansonsten haben die ein oder anderen Mops noch einen von 0.
m_dwRunawayDelay = 1000: Hab ich genauso wenig Ahnung von.
SetRunAway( 10, MI_DORIDOMA1, 2 ): Dies bewirkt, das der Gegner sich ab einer bestimmten HP Rate vom Spieler abwendet. 10 steht in diesem Fall für die % Rate der HP, welche unterboten werden muss. MI_DORIDOMA1 glaub ist, ist ein Mop, zu welches sich das fliehende Monster hinbewegen würde... Allerdings kann ich keien Garantie geen! Man kann es auch durch 0 ersetzen. wofür die 2 wieder steht hab ich malwieder (...) keinen blassen schimmer.
SetCallHelper( 100, MI_NUCTUVEHICLE2, 5, TRUE): Hier wirds wieder Komplitziert. Ich kann euch nicht sagen, was dieser Befehl eigentlich bewirken soll... Ich kann nur soviel sagen, das 100 für irgendwelche HP in % steht. MI_NUCTUVEHICLE2 wohl für die Gegner, welche er "um Hilfe ruft", 5 nehme ich ma an für die Anzahl und das TRUE (oder FALSE) steht, laut beschreibung, für "bParty"... Allerdings was das genau heißen soll/welche Bedeutung das nun letzendlich hat, kann ich nicht sagen... Sorry Guys, kann euch malwieder net helfen :P
m_nAttackFirstRange = 10: Ich bin zwar nicht sicher, aber vielleicht die Entfernung des Ersten Angriffs des Gegners, welches eine Fernattacke ist. Ihr kennt doch einige Gegner. Erst einmal Fernkampfangriff gemacht und dann zu euch hergerannt und nur noch Nahkampf. Allerdings geb ich wieder keine Garantie...
DropKind(IK3_SUIT, 6, 13): Ich hab den Befehl nicht wirklich verstanden, bzw ich kann ihn nicht nachvollziehen (is auch doof, wenn man all das ja net testen kann! Caali Files FTL. Kann euch nicht wirklich viel zu den Variablen erzählen, lediglich das IK3_SUIT wohl für eine Suit stehen würde... Aber darauf wärt ihr wohl selbst gekommen, oder? ^^
DropEvenitem: Fehlt wieder jegliche Beschreibung im Spiel. Ich müsste schon hellsehen um das zu verstehen.
DropQuestItem(): Is mir ebenso vorenthalten, wie schon bereits ein paar andere Befehle.
P.S.: Die // dienen dazu, das der Befehl keine Wirkung hat. mit anderen Worten: Das Evade des Aibatts funktioniert nicht, weil es von den GMs aus irgendeinem Grund rausgenommen wurde. Das Spiel würde also so fortfahren, als würde es den Befehl nicht geben. Ist praktisch, wenn man mal vorrübergehend einen Befehl deaktivieren will, aber ihn nicht gleich löschen will, um ihn später wieder einzutragen. Das Funktioniert auch beim Trade Code und den anderen!
Dropwahrscheinlichkeit
Quellcode
- [COLOR=Red]9375 0.0003125% 320000
- 18750 0.000625% 160000
- 37500 0.00125% 80000
- 75000 0.0025% 40000
- 150000 0.005% 20000
- 300000 0.01% 10000
- 1000000 0.0333% 3000
- 1875000 0.0625% 1600
- 3000000 0.1% 1000
- 3750000 0.125% 800
- 5000000 0.166% 600
- 7500000 0.25% 400
- 15000000 0.5% 200
- 30000000 1% 100
- 300000000 10% 10
- 3000000000 100% 1[/COLOR]
Die 2. für den Prozentsatz
Die 3. weiß ich nicht genau den nutzen von... 100% steht für 1. Und wenn du dann 10% davon nehmen wilslt, rechnest du es rückwärts. So ergebe 10% 10 und 1% 100. Mit anderen Worten: die Zahl, welche du die % oder Wahrscheinlichkeit mal nehmen musst, um wieder 100% Dropchance zu erreichen.
Wie berechne ich nun aus, welche Zahl ich für einen bestimmten Prozentsatz ich nehmen soll?
Leute, das ist einfaches Mathe... aber ich erklärs nomma:
Wenn man z.B. 5% haben will,
schnappt man sich die Zahl von einem gescheiten Prozentsatz. Z.B. nehmen wir nun einach mal das von 1%, weil es am einfachsten zu rechnen ist (OK, 10% wäre vlt einfacher.. egal). Dort haben wir die Zahl 30000000 (30.000.000 - 30Millionen - 3*10^8).Dann rechnest die 30000000 mal 5. Das würde dann 150000000 ergeben (150.000.000 - 150Millionen - 15*10^7).
NCD - Non-character dialoge? kA^^
Beispiel (Achaben aus Darkon):
Quellcode
- [COLOR=Red]"@@DATA@@"
- {
- AddNPCChat( "Do you need very cheap, but powerful goods? If yes, come to Achaben's General Shop!" );
- AddNPCChat( "I'm selling Refreshers, Vital Drinks and various pills for cheap!" );
- AddNPCChat( "Very very high-quality goods for a low price at Achaben's General Shop!" );
- };
- "main"
- {
- RemoveAllTextButtons( );
- AddText( "Hello %PLAYERNAME% !" );
- AddTextButton( "Bye!" );
- AddTextButton( "Introduction" );
- };
- "Bye!"
- {
- CloseWindow( );
- NPCChat( "Have a nice day!" );
- };
- "Introduction"
- {
- AddText( "I'm Achaben, I run the General Shop here! I sell almost all miscellaneous goods, and cheaply." );
- };[/COLOR]
Aufbau:
Quellcode
- [COLOR=Red]"@@DATA@@"
- {
- AddNPCChat( "Do you need very cheap, but powerful goods? If yes, come to Achaben's General Shop!" );
- AddNPCChat( "I'm selling Refreshers, Vital Drinks and various pills for cheap!" );
- AddNPCChat( "Very very high-quality goods for a low price at Achaben's General Shop!" );
- };[/COLOR]
Z.B. bei diesem hier werden in den sprechblasen, die ein NPC manchmal von sich gibt einer dieser 3 texte stehen. Aber es gibt auch andere befehle die man einfügen könnte.
in diesem fall werden alle buttons entfernt, der text "hello *name des spielers* eingeblendet
und die buttons "Bye" und "Introduction" hinzugefügt.
Das sind im groben die 3 teile aus denen der NPC "besteht".
nun kommen wir aber zu der beschreibung der befehle:
AddNPCChat( "Text" );
der in den " stehende text wird ab und an in form von einer sprechblase, die der NPC manchmal von sich gibt angezeigt.
AddText( "Text" );
Mit diesem Befehl wird sofort und einmalig eine Sprechblase erzeugt mit dem darin enthaltenen text.
AddTextButton( "Morsche" );
Erstellt einen Button mit der aufschrit Morsche. Dies dient zur interaktion mit dem NPC.
RemoveAllTextButtons( );
Entfernt alle momentan vorhandenen TextButtons. ratsam dies in jeder neuen befehlszeile zu schreiben. und vorallem: bevor man neue buttons erstellt^^
AddText( "Hallo du kleiner Zwerg!" );
Zeigt dann im Dialogfenster des NPCs den Text mit der aufschrift Hallo du kleiner Zwerg an.
SetNPCEquipment( 6, 751 );
gibt dem NPC ein bestimmtes Equipment. in diesem Falle einen RoyalBluemoon helmet. Die 6 steht in diesem Fall für die Parts. Z.B. hat das Red Dress Helmet das Part 26. Ihr könnt das ganz einfach in eurer DB eintragen. Wenn Part und Item ID nicht stimmen, dann funkst es auch net. Man kann auch ihnen eine Waffe geben.
VORSICHT: ich glaube es geht nur, wenn der NPC ein das model eines spielers hat. Wenn dies der fall ist. sollte man diesen Befehl möglichst bei der Data Befehlsleiste einfügen, ansonsten is der NPC nackt^^. und wenn möglich auch die klamotten passend zum gechlecht... sonst siehts etwas komisch aus :P
P.S.: Der Befehl funktioniert glaub ich nur unter der Data Befehlsleiste.. ansonsten kommt bei meiner Worldserver.exe eine Fehlermeldung:
CNCDParser: :ExecuteBlock -> Unrecognized command "SetNPCEquipment"!
Could not execute the NPC Speech file for MaDa_Laloa with arguments Red Dress Klamotten ! ErrorCode: 5
vlt kann jemand was mit dem Fehlercode anfangen :P
Codes für die texte:
%PLAYERNAME% - Zeigt den spielernamen an
/" - zeigt ein " an
Info: ich nehme an das man mit / auch andere sonderzeichen zeigen lassen kann... un ich weiß net ob umlaute aus dem deutschen funktionieren
ich nehms einfach ma an^^
Für die, die rev 2 nutzen gibt es aber andere Files als NCDs. Sie sind zwar komplitzierter, aber weitaus besser, weil man da mehr Möglichkeiten besitzt. Diese werden mal hier beschrieben:
Quellcode
- [COLOR=Red]function OnLoadData( )
- math.randomseed( os.time() )
- nps_SetNPCChatInterval(math.random(10000,20000))
- nps_AddNPCChat( "There are so many flowers today! And they look so beautiful!" );
- nps_SetNPCEquipment("PARTS_CAP","II_ARM_F_MAG_HELMET08")
- nps_SetNPCEquipment("PARTS_UPPER_BODY","II_ARM_F_MAG_SUIT08")
- nps_SetNPCEquipment("PARTS_HAND","II_ARM_F_MAG_GAUNTLET08")
- nps_SetNPCEquipment("PARTS_FOOT","II_ARM_F_MAG_BOOTS08")
- nps_SetNPCEyeStyle(2)
- nps_SetNPCHairStyle(0)
- nps_SetNPCHairColor(0xFF080808)
- return 1
- end
- function OnOpenWindow( )
- nps_RemoveAllTextButtons( )
- nps_AddText( nps_GetString("IDS_MADA_LALOA_OPEN_WINDOW_TEXT") )
- nps_AddTextButton( nps_GetString("IDS_MADA_LALOA_TB_BYE"), "BUTTON_BYE" )
- nps_AddTextButton( nps_GetString("IDS_MADA_LALOA_TB_INTRODUCTION"), "BUTTON_INTRODUCTION" )
- return 1
- end
- function OnButton(szButtonName)
- if( szButtonName == "BUTTON_BYE" ) then return OnButtonBye( )
- elseif( szButtonName == "BUTTON_INTRODUCTION" ) then return OnButtonIntroduction( )
- else return 0
- end
- end
- function OnButtonBye( )
- nps_CloseWindow( )
- nps_NPCChat( "Have a nice day!" )
- return 1
- end
- function OnButtonIntroduction( )
- nps_AddText( nps_GetString("IDS_MADA_LALOA_INTRODUCTION") )
- return 1
- end[/COLOR]
Nun zur Erläuterung:
math.randomseed( os.time() )
Is mir Ungewiss... steht aber bei jedem dabei, also iwas wichtiges. Ich nehme mal an, irgendwas für für den zufälligen Interval des untenstehenden Befehls.
nps_SetNPCChatInterval(math.random(10000,20000))
Die Zeit zwichen den Sprechblasen des NPCs. In diesem Fall ist es eine zufällige Zahl zwichen 10000ms und 20000ms.
nps_AddNPCChat( "There are so many flowers today! And they look so beautiful!" );
Der Text, welcher in den Sprechblasen angezeigt werden soll.
nps_SetNPCEquipment("PARTS_FOOT","II_ARM_F_MAG_BOOTS08")
Gibt deinem NPC Klamotten und anderen Müll^^ "PARTS_FOOT" steht für das Teil, welches er tragen soll und "II_ARM_F_MAG_BOOTS08" für das Item, welcher er tragen soll. Leider geht es nun net mehr über item ID und Partnummer... schade eigentlich, aber solange es irgendwie noch geht isses in Ordnung.
nps_SetNPCEyeStyle(2)
Legt fest, welches Face der NPC haben soll.
nps_SetNPCHairStyle(0)
Das gleiche wie beim Face, nur für die Frisi
nps_SetNPCHairColor(0xFF080808)
Und das gleiche nomma für die Haarfarbe
return 1
Wofür das return steht hab ich leider auch keine wirkliche Ahnung...
nps_RemoveAllTextButtons( )
Das gleiche wie schon bei den NCDFiles... terminiert alle Buttons.
nps_AddText( nps_GetString("IDS_MADA_LALOA_OPEN_WINDOW_TEXT") )
Fügt den Thread, welcher für die Variable "[COLOR]IDS_Mada_LALOA_OPEN_WINDOW_TEXT" gespeichert worden ist. Die Datei in welcher diese Variable gespeichert worden ist findet man unter dem Ordner "Language\en_en\NPSFiles"
nps_AddTextButton( nps_GetString("IDS_MADA_LALOA_TB_INTRODUCTION"), "BUTTON_INTRODUCTION" )
Er erstellt einen Button und legt die Variable "BUTTON_INTRODUCTION" für ihn fest. Die Beschriftung des Buttons lädt er von der Variable "IDS_MADA_LALOA_TB_INTRODUCTION"
nps_CloseWindow( )
Schließt das Fenster^^
nps_NPCChat( "Have a nice day!" )
Erstellt eine Sprechblase mit dem Text "Have a nice day!"
nps_AddNPCChat( "There are so many flowers today! And they look so beautiful!" );
Legt fest, dass einer der Sprechblasen, welche der NPC von sich gibt, folgenden Text beinhaltet.
wos - world object scripts
des hier ist glaub ich das komplitzierteste von allen...
zumindestens wenn man etwas größeres damit basteln will
die wos werden aktiviert, sobald man ein objekt benutzt, welches man in der datenbank unter der tabelle spawns_worldobjects eingetragen hat. welches script bei welchem objekt verwendet werden soll, kann man ebenfalls in der DB einstellen
Das beste beispiel ist wohl der masdungeon (serus uriel box):
Quellcode
- [COLOR=Red]dwMobChance = math.random(0,100)
- szMobName = ""
- dwMobCount = 0
- bSpecial = 0
- if (dwMobChance < 30) then
- szMobName = "MI_VICEVEDUQUE"
- dwMobCount = 5
- elseif (dwMobChance < 70) then
- szMobName = "MI_DUBANG1"
- dwMobCount = 5
- elseif (dwMobChance < 99) then
- szMobName = "MI_WORMVEDUQUE"
- dwMobCount = 1
- else
- szMobName = "MI_SERUSURIEL"
- dwMobCount = 1
- bSpecial = 1
- end
- if (bSpecial ~= 1) then
- if (wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1) ~= 0) then
- wos_ShowWorldObjectAnimation()
- wos_SetInvisibleWithTimeout(60000) --1min
- end
- else
- MobClientID = wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1)
- if (MobClientID ~= 0) then
- wos_ShowWorldObjectAnimation()
- wos_SetInvisibleWithTimeout(60000) --1min
- wos_MonsterCastSkill(MobClientID,"SI_GEN_STUNGROUP",5)
- wos_MonsterCastSkill(MobClientID,"SI_GEN_FLASH",5)
- end
- end[/COLOR]
daaaaaaaaaaann fangen wir mal an.. stückchenweise:
dwMobChance = math.random(0,100)
szMobName = ""
dwMobCount = 0
bSpecial = 0
das sind variablen die festgelegt werden...
wobei man bei ersteren sagen muss, das die "festgelegte" variable eine zufällige mathematische zahl (integer - also nur ganze zahlen) zwichen 0 un 100 ist. beim 2. existiert keine und bei den anderen 2 sind die variablen eben 0^^
Quellcode
- [COLOR=Red]if (dwMobChance < 30) then
- szMobName = "MI_VICEVEDUQUE"
- dwMobCount = 5
- elseif (dwMobChance < 70) then
- szMobName = "MI_DUBANG1"
- dwMobCount = 5
- elseif (dwMobChance < 99) then
- szMobName = "MI_WORMVEDUQUE"
- dwMobCount = 1
- else
- szMobName = "MI_SERUSURIEL"
- dwMobCount = 1
- bSpecial = 1
- end[/COLOR]
im grunde sagt sie aus:
wenn die variable von dwMobChance (welche ja oben per zufall festgelegt worden ist) kleiner als 30 ist, dann ist die variable für szMobname gleich "MI_VICEVEDUQUE" und die variable für dwMobCount wäre dann 5. falls dies aber nicht der fall ist, wird überprüt ob die variable kleiner ist als 70. das geht also immer so weiter bis die if abfrage fertig ist. wenn dann entweder die variable der dwMobChance zutreffend für eines der abfragen ist, oder wenn alle abfragen "ungültig" sind und demnach dann das letzte (also serus uriel) ausgeführt wird, endet die abfrage. das heißt also, wenn z.B. die zahl kleiner als 30 ist, führt er die anderen i abfragen nicht durch.
Danach führt das jeweilige objekt eine animation aus (in der klammer könnte man vlt etwas festlegen, aber ich hab keine ahnung was). und das objekt wird dann ür 1 minute lang "unsichtbar"... bzw mehr oder weniger nicht existent und spawnt nach einer min wieder neu.
Quellcode
- [COLOR=Red]MobClientID = wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1)
- if (MobClientID ~= 0) then
- wos_ShowWorldObjectAnimation()
- wos_SetInvisibleWithTimeout(60000) --1min
- wos_MonsterCastSkill(MobClientID,"SI_GEN_STUNGROUP",5)
- wos_MonsterCastSkill(MobClientID,"SI_GEN_FLASH",5)
- end
- end[/COLOR]
Spawnt ein Monster, welches in der Variable szMobName vorher gespeichert worden ist, mit der Anzahl, die in dwMobCount gespeichert worden ist. Aggro Chance beträgt 100%, Radius des Kreises, in welchem es gespawnt wird beträgt 2 und die 1 steht für die Größe des Monsters.
Ebenso wird die ID des gespawnten Monsters über eine If-Schleife überprüft. Sollte die ID ungleich 0 sein, so führt das wos folgende Befehle aus:
Das WO führt eine Animation aus (in diesem Fall öffnet sich die Truhe)
Die Truhe wird für eine Minute lang "unsichtbar" (für den Spieler praktisch nicht existent)
Das/die Monster setzen einen Skill ein, welcher den Namen "SI_GEN_STUNGROUP" trägt und lvl 5 beträgt.
befehlserleuterung:
wos_GetClientLevel(X)
X = das Level, auf welches der Spieler gesetzt werden soll
Oder die Anzahl der lvl ups?
wos_GetClientEXP(X)
X = die EXP, welche der Spieler bekommt
wos_GetClientAccessLevel(X)
X = das Acces Level, auf welches der Spieler gesetzt wird (1000 = GM, 100 = normaler Spieler)
wos_GetClientGender(X)
X = Das geschlecht auf welches er gesetzt wird.
1 = weiblich
2 = männlich? (oder war male 0? weiß nemmer)
wos_GetClientPenya(X)
X = Anzahl der Penya die der Spieler bekommt, oder auf welches seine Penyas gesetzt werden?
wos_HasClientItemInInventory("II_SYS_SYS_KEY_DKDUIDCARD",1)
Überprüft ob der Spieler das Item DKDUIDCARD besitzt. Wird soweit ich weiß nur in if-Schleifen verwendet oder?
Z.B.
if wos_HasClientItemInInventory("II_SYS_SYS_KEY_DKDUIDCARD",1) ~= 0 then
überprüft die anzahl des Items. Die if-schleife wird erst aktiv, wenn die Anzahl NICHT 0 beträgt (also größer als 0... oder weniger als null.. aber man kann net weniger items haben als 0 :P )
wos_ClientSendDefinedText("ZZZ")
ZZZ steht für den Text, welcher der Client in form von einer noramlen Chatnachricht von sich gibt, kann das sein? Müssen dann auch " gesetzt werden?
wos_TeleportClientWorld(X,Y,Z)
Teleportiert den Spieler an folgende Koordinaten.
wos_TeleportClientWorld("WI_DUNGEON_DA_DK",745,85,780)
Teleportiert den Spieler in die World, mitsamt den Koordinaten.
wos_RemoveItemFromClientInventory("II_SYS_SYS_KEY_DKDUIDCARD",1)
Terminiert ein bestimmtes Item, welches sich im Inventar des Spielers befindet. In diesem Falle 1 mal das Item DKDUIDCARD
wos_SpawnMonstersInCircle(M,N,A,E,G)
M = Name des Monsters
N = Anzahl der zu spawnenden Monster
A = Aggro Chance in %
E = Entfernung, bzw Radius des Kreises in welchem er gespawnt wird
G = Größe des Monsters
Spawnt also ein Monster in einem Bestimmten Kreis mit den Oben stehenden Variablen
wos_SetInvisibleWithTimeout(X)
Macht das WorldObject für eine bestimmte anzahl von millisekunden "unsichtbar" und demnach im grunde nicht existenz für den Spieler
wos_ShowWorldObjectAnimation()
Spielt die Animation des WO ab.. was allerdings kommt in die Klammer rein? bzw könnte
wos_ShowOtherWorldObjectAnimation(X)
Spielt die Animation des WOs ab, welches die ID in der Klammer besitzt (wird in der DB festgelegt)
wos_ShowSfxOnClient()
Spielt einen bestimmten Effekt an der position deines Charas ab. Allerdings kenn ich die Variablen nicht
wos_ShowSfxOnWorldObject()
Das gleiche wie Oben, allerdings gültig für das WO
wos_MonsterCastSkill(M,S,L)
Lässt ein bestimmtes Monster einen Skill casten
M = Monster ID
S = Name des Skills
L = Skilllevel
Allerdings, wird der Skill dann nur während der Aktivierung des wos einmalig eingesetzt, oder?
das wos ist mit abstand das komplitzierteste aller teile die ich hier aufgelistet habe.. dafür kann man aber auch vieeeeel lustigere sachen damit basteln... Lasst eurer Fantasie freien Lauf!
*server.ini Dateien
login_server.ini
Quellcode
[server]
Allgemeine einstellungen
[isc]
Erreichungseinstellungen wie port und IP
[mysql]
Einstellungen für die Database
Erklärung:
[server]
ip=localhost
hier wird dann deine Ip eingetragen du du benutzten willst, damit man auf den server connecten kann.. dies kann z.B: deine LAN IP sein (entweder per Lanparty oder wenn du eine statische IP hast), eine umgeleitete IP/domain oder z.B: andere feste IPs wie deine hamachi IP z.B.
Die IP muss dann in der neuz.ini im client eingetragen werden
port=23000
welchen port du benutzen willst.. es empfiehlt sich dies zu belassen, da ich z.B. dies dann auch beim client bearbeiten müsste... und ich weiß net wie
minAccessLevel=0
hier legt man fest, welche rechte ein account haben muss um connecten zu können. die rechte kann man in der DB einstellen
id=1
keine ahnung^^
name=LoginServer
der name? oO also ich hab den bisher ingame nie gesehen :P
use_flyff_a=1
hab ich auch keine ahnung von
Rev_2 Befehle:
data_path=..\Data
Gib an, in welcher der Ordner "data" ist.
log_path=Log
Das gleiche wie oben, nur diesmal für den Log
flyff_a_md5=
Nicht bekannt
owner=1
Ist mit ebenfalls nicht genau bekannt.
[isc]
ip=localhost
Irgendeine IP - kA für was
port=29300
das gleiche gilt hier genauso wie bei der IP
[mysql]
server=localhost
die IP wo die DB gespeichert ist, worauf der server zugreifen soll
database=flyff
name der DB auf welche der server zugreifen soll
username=***
Username für die DB
password=***
Passwort für die DB
char_server.ini
Quellcode
ip=localhost
Siehe oben
port=28000
Siehe oben
minAccessLevel=0
Siehe oben
id=2
Siehe oben
owner=1
Siehe oben
name=Sarara
Der name des Servers, in der linken spalte des Serverauswahlmenus. (z.B. Clockwork, Glaphan, Aibatt, Burudeng, etc)
data_path=..\Data
Siehe oben
log_path=Log
Siehe oben
use_gameguard=0
Weiß ich auch nicht so genau, aber ich glaube hier kannst du einstellen ob GG aktiviert sein muss, um drauf zu connecten zu können
gameguard_auth_query_interval=10000
Ist mir nicht bekannt
[isc]
ip=localhost
Siehe oben
port=29300
Siehe oben
[mysql]
server=localhost
Siehe oben
database=flyff
Siehe oben
username=***
Siehe oben
password=***
Siehe oben
world_server.ini
Quellcode
- [COLOR=Red][server]
- ip=localhost
- port=15400
- minAccessLevel=0
- id=3
- owner=2
- channel_number=1
- name=Reinforce
- data_path=..\Data
- log_path=Log
- exprate=1.0
- fxprate=1.0
- droprate=1.0
- penyadroprate=1.0
- questdroprate=1.0
- motd=
- welcomemsg=Chibbie
- weather=2
- random_weather=0
- random_weather_interval=300000
- can_trade_quest_items=1
- can_drop_quest_items=1
- can_player_shop_quest_items=1
- can_mail_quest_items=1
- can_guild_bank_quest_items=1
- use_item_cooldown=0
- use_item_casting_timers=0
- use_action_slot_cooldown=0
- guild_rejoin_waiting_time=0
- #guild_rejoin_waiting_time=172800
- allowPK=0
- allowKS=1
- everywherePVP=1
- allowGuildBank=1
- precompile_nps_files=0
- dice_minigame_min_bet=100
- dice_minigame_max_bet=100000000
- dice_minigame_win_factor=5
- [isc]
- ip=localhost
- port=29300
- [mysql]
- server=localhost
- database=flyff
- username=***
- password=***[/COLOR]
ip=localhost
siehe oben
port=15400
siehe oben
minAccessLevel=0
siehe oben
id=3
siehe oben
owner=2
siehe oben
channel_number=1
Lege fest, welche Nummer der Channel bekommen soll
name=Reinforce
siehe oben
data_path=..\Data
Siehe oben
log_path=Log
Siehe oben
exprate=1
das spricht doch wohl für sich selbst?^^ halt die normale EXP rate die man bekommt standart ist 1
fxprate=1
das gleiche wie bei der exp rate, nur das dies für die exp fürs fliegen gilt
droprate=1
droprate von den items, welches ein monster nach seinem tod hinterlässt...
penyadroprate=1
Droprate der Penyas oO
questdroprate=1
das gleiche wie bei der droprate, nur halt für questis
motd=Möp se
message of the day - nachricht die angezeigt werden soll, wenn du dich einloggst
welcomemsg=Chibbie
Etwas ähnliches wie motd
weather=2
welches wetter auf dem server beim start sein soll
0 = nichts
1 = regen
2 = schnee
random_weather=0
stellt ein ob das wetter sich ändert
0 = nein
1 = ja
random_weather_interval=0
interval in sekunden, wann sich das wetter wieder ändern soll
can_trade_quest_items=1
zum einstellen ob man questis traden kann
can_drop_quest_items=1
zum einstellen ob man questis traden kann, die man nur bekomtm während ein bestimmter quest aktiv ist
can_player_shop_quest_items=1
ob man questis innem aufgemachten shop anbieten/verkaufen kann
can_mail_quest_items=1
ob man questitems per mail versenden kann
can_guild_bank_quest_items=1
ob man in die gildenbank quest items stopfen kann (maaan das sind zu viele questis einstellungen >.>)
use_item_cooldown=0
ob ein item sich wieder aufladen muss, wenn ma nes eingesetzt hat (z.B. food)
use_item_casting_timers=0
ob man zum einsetzen eines items warten muss (z.B. board oder blinkwing)
use_action_slot_cooldown=0
ob der Action slot "überladen" werden kann und somit nicht voll funktionstüchtig ist oder ob er frei verwendbar ist
guild_rejoin_waiting_time=0
ob man nach dem leaven einer gilde wieder warten muss
#guild_rejoin_waiting_time=172800
die dauer wielange man warten muss um in eien neue guilde zu joinen in sekunden
allowPK=0
Player Kill ein oder aus
allowKS=1
Kill stealing ein oder aus
allowGuildBank=1
Willste ne Gildenbank?
precompile_nps_files=0
Ich glaube das dient dazu da, das von den NPSFiles ne sicherheitskopie gemacht wird, mit der endung .pre hintendran. Allerdings versteh ich nicht genau den Sinn und Zweck, dieser Option.
everywherePVP=1
PvP überall oder nur Duellarena
dice_minigame_min_bet=100
Minimum Gebot, für das Dice Minispiel
dice_minigame_max_bet=100000000
Maximum Gebot, für das Dice Minispiel
dice_minigame_win_factor=5
Der Faktor um wieviel dein gewettetes Geld multiplitziert wird, welches du bei Gewinn erhältst
Information:
Die Serverconfigbefehle basieren auf Caali's Rev_2 Files. Es kann also sein, das einige Befehle für Rev_1 ungültig oder unbrauchbar sind.
Ich hoffe, ich konnte einigen von euch wengistens etwas helfen, und genauso sehr hoffe ich, das andere mir und den Bedürftigen auch helfen, indem sie die Liste erweitern! Wenn die Liste irgendwann doch zu groß werden sollte, werd ich ma überlegen ob ich den Thread vlt dann in mehrere spalte... Aber momentan sind wir ja noch weit davon entfernt (atm gleicht es mehr so einem Tutorial...)
Außerdem, bitte nicht klauen! Wenn jemand das kopieren will und wo anders verbreiten will bitte vorher fragen, oder einfach hier her verlinken! Danke.
P.S.: Auf Wunsch kann ich die Listen auch durch weitere Erweitern. Wenn ihr mir eine Vorlage oder einen Wunsch liefert, kann ich dies auch hinzufügen.
Changelog:
1.11.2008
-Ein, mir unbekannter Befehl beim wos wurde (dank Darkdevil1) erklärt
-Die wos Befehle wurden (dank Darkdevil1) erweitert
-Habe einen weiteren Komentar zum Code des Aibatts bei AIData hinzugefügt
-"Code-Funktion" in meinem Thread verwendet, damit die Befehlszeilen besser zu erkennen sind
31.10.2008
-Extreme Erweiterung aller, vom Client bekannten Befehle für die AI
-Einige Erweiterungen für die Server Configs.
Ein Danke für all jene, die mir geholfen haben die Liste zu erweitern:
Darkdevil1
-Erläuterung eines, mir unverständlichen Befehls beim wos.
-Auflistung sehr vieler wos Befehle