Diverse Befehlslisten (aid, ncd, nps, wos und *server.ini)

    • Diverse Befehlslisten (aid, ncd, nps, wos und *server.ini)

      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...):

      Quellcode

      1. [COLOR=Red]AI{#Scan{scan}#battle{Attack cunning low summon 50 5 164}#move{Loot d 5}}[/COLOR]
      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?)

      Quellcode

      1. [COLOR=Red]AI{#data{m_dwattackmovedelay=2000 m_dwrunawaydelay=3000 m_nattackfirstrange=8}#Scan{scan}#battle{ }#move{ }}[/COLOR]
      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:

      Quellcode

      1. [COLOR=Red]MI_AIBATT1
      2. {
      3. Maxitem = 2;
      4. DropGold(6, 9);
      5. DropItem(II_GEN_GEM_GEM_TWINKLESTONE, 300000000, 0, 1);
      6. m_dwAttackMoveDelay = 2000;
      7. m_dwRunawayDelay = 3000;
      8. m_nAttackFirstRange = 8;
      9. AI
      10. {
      11. #Scan
      12. {
      13. scan
      14. }
      15. #battle
      16. {
      17. Attack cunning low
      18. // evade 5
      19. }
      20. #move
      21. {
      22. Loot d 5
      23. }
      24. }
      25. }[/COLOR]
      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

      Quellcode

      1. [COLOR=Red]9375 0.0003125% 320000
      2. 18750 0.000625% 160000
      3. 37500 0.00125% 80000
      4. 75000 0.0025% 40000
      5. 150000 0.005% 20000
      6. 300000 0.01% 10000
      7. 1000000 0.0333% 3000
      8. 1875000 0.0625% 1600
      9. 3000000 0.1% 1000
      10. 3750000 0.125% 800
      11. 5000000 0.166% 600
      12. 7500000 0.25% 400
      13. 15000000 0.5% 200
      14. 30000000 1% 100
      15. 300000000 10% 10
      16. 3000000000 100% 1[/COLOR]
      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):

      Quellcode

      1. [COLOR=Red]"@@DATA@@"
      2. {
      3. AddNPCChat( "Do you need very cheap, but powerful goods? If yes, come to Achaben's General Shop!" );
      4. AddNPCChat( "I'm selling Refreshers, Vital Drinks and various pills for cheap!" );
      5. AddNPCChat( "Very very high-quality goods for a low price at Achaben's General Shop!" );
      6. };
      7. "main"
      8. {
      9. RemoveAllTextButtons( );
      10. AddText( "Hello %PLAYERNAME% !" );
      11. AddTextButton( "Bye!" );
      12. AddTextButton( "Introduction" );
      13. };
      14. "Bye!"
      15. {
      16. CloseWindow( );
      17. NPCChat( "Have a nice day!" );
      18. };
      19. "Introduction"
      20. {
      21. AddText( "I'm Achaben, I run the General Shop here! I sell almost all miscellaneous goods, and cheaply." );
      22. };[/COLOR]
      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:

      Quellcode

      1. [COLOR=Red]"@@DATA@@"
      2. {
      3. AddNPCChat( "Do you need very cheap, but powerful goods? If yes, come to Achaben's General Shop!" );
      4. AddNPCChat( "I'm selling Refreshers, Vital Drinks and various pills for cheap!" );
      5. AddNPCChat( "Very very high-quality goods for a low price at Achaben's General Shop!" );
      6. };[/COLOR]
      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.


      Quellcode

      1. [COLOR=Red]"main"
      2. {
      3. RemoveAllTextButtons( );
      4. AddText( "Hello %PLAYERNAME% !" );
      5. AddTextButton( "Bye!" );
      6. AddTextButton( "Introduction" );
      7. };[/COLOR]
      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.


      Quellcode

      1. [COLOR=Red]"Introduction"
      2. {
      3. AddText( "I'm Achaben, I run the General Shop here! I sell almost all miscellaneous goods, and cheaply." );
      4. };[/COLOR]
      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:

      Quellcode

      1. [COLOR=Red]function OnLoadData( )
      2. math.randomseed( os.time() )
      3. nps_SetNPCChatInterval(math.random(10000,20000))
      4. nps_AddNPCChat( "There are so many flowers today! And they look so beautiful!" );
      5. nps_SetNPCEquipment("PARTS_CAP","II_ARM_F_MAG_HELMET08")
      6. nps_SetNPCEquipment("PARTS_UPPER_BODY","II_ARM_F_MAG_SUIT08")
      7. nps_SetNPCEquipment("PARTS_HAND","II_ARM_F_MAG_GAUNTLET08")
      8. nps_SetNPCEquipment("PARTS_FOOT","II_ARM_F_MAG_BOOTS08")
      9. nps_SetNPCEyeStyle(2)
      10. nps_SetNPCHairStyle(0)
      11. nps_SetNPCHairColor(0xFF080808)
      12. return 1
      13. end
      14. function OnOpenWindow( )
      15. nps_RemoveAllTextButtons( )
      16. nps_AddText( nps_GetString("IDS_MADA_LALOA_OPEN_WINDOW_TEXT") )
      17. nps_AddTextButton( nps_GetString("IDS_MADA_LALOA_TB_BYE"), "BUTTON_BYE" )
      18. nps_AddTextButton( nps_GetString("IDS_MADA_LALOA_TB_INTRODUCTION"), "BUTTON_INTRODUCTION" )
      19. return 1
      20. end
      21. function OnButton(szButtonName)
      22. if( szButtonName == "BUTTON_BYE" ) then return OnButtonBye( )
      23. elseif( szButtonName == "BUTTON_INTRODUCTION" ) then return OnButtonIntroduction( )
      24. else return 0
      25. end
      26. end
      27. function OnButtonBye( )
      28. nps_CloseWindow( )
      29. nps_NPCChat( "Have a nice day!" )
      30. return 1
      31. end
      32. function OnButtonIntroduction( )
      33. nps_AddText( nps_GetString("IDS_MADA_LALOA_INTRODUCTION") )
      34. return 1
      35. end[/COLOR]
      Alles anzeigen
      Aufbau: gleich, mit nur einem zusätzlichen Eintrag:

      Quellcode

      1. [COLOR=Red]function OnButton(szButtonName)
      2. if( szButtonName == "BUTTON_BYE" ) then return OnButtonBye( )
      3. elseif( szButtonName == "BUTTON_INTRODUCTION" ) then return OnButtonIntroduction( )
      4. else return 0
      5. end
      6. end[/COLOR]
      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):


      Quellcode

      1. [COLOR=Red]dwMobChance = math.random(0,100)
      2. szMobName = ""
      3. dwMobCount = 0
      4. bSpecial = 0
      5. if (dwMobChance < 30) then
      6. szMobName = "MI_VICEVEDUQUE"
      7. dwMobCount = 5
      8. elseif (dwMobChance < 70) then
      9. szMobName = "MI_DUBANG1"
      10. dwMobCount = 5
      11. elseif (dwMobChance < 99) then
      12. szMobName = "MI_WORMVEDUQUE"
      13. dwMobCount = 1
      14. else
      15. szMobName = "MI_SERUSURIEL"
      16. dwMobCount = 1
      17. bSpecial = 1
      18. end
      19. if (bSpecial ~= 1) then
      20. if (wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1) ~= 0) then
      21. wos_ShowWorldObjectAnimation()
      22. wos_SetInvisibleWithTimeout(60000) --1min
      23. end
      24. else
      25. MobClientID = wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1)
      26. if (MobClientID ~= 0) then
      27. wos_ShowWorldObjectAnimation()
      28. wos_SetInvisibleWithTimeout(60000) --1min
      29. wos_MonsterCastSkill(MobClientID,"SI_GEN_STUNGROUP",5)
      30. wos_MonsterCastSkill(MobClientID,"SI_GEN_FLASH",5)
      31. end
      32. end[/COLOR]
      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^^


      Quellcode

      1. [COLOR=Red]if (dwMobChance < 30) then
      2. szMobName = "MI_VICEVEDUQUE"
      3. dwMobCount = 5
      4. elseif (dwMobChance < 70) then
      5. szMobName = "MI_DUBANG1"
      6. dwMobCount = 5
      7. elseif (dwMobChance < 99) then
      8. szMobName = "MI_WORMVEDUQUE"
      9. dwMobCount = 1
      10. else
      11. szMobName = "MI_SERUSURIEL"
      12. dwMobCount = 1
      13. bSpecial = 1
      14. end[/COLOR]
      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.


      Quellcode

      1. [COLOR=Red]if (bSpecial ~= 1) then
      2. if (wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1) ~= 0) then
      3. wos_ShowWorldObjectAnimation()
      4. wos_SetInvisibleWithTimeout(60000) --1min
      5. end
      6. else[/COLOR]
      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.



      Quellcode

      1. [COLOR=Red]MobClientID = wos_SpawnMonstersInCircle(szMobName,dwMobCount,100,2,1)
      2. if (MobClientID ~= 0) then
      3. wos_ShowWorldObjectAnimation()
      4. wos_SetInvisibleWithTimeout(60000) --1min
      5. wos_MonsterCastSkill(MobClientID,"SI_GEN_STUNGROUP",5)
      6. wos_MonsterCastSkill(MobClientID,"SI_GEN_FLASH",5)
      7. end
      8. end[/COLOR]
      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

      Quellcode

      1. [COLOR=Red][server]
      2. ip=localhost
      3. port=28000
      4. minAccessLevel=0
      5. id=2
      6. owner=1
      7. name=Sarara
      8. data_path=..\Data
      9. log_path=Log
      10. use_gameguard=0
      11. gameguard_auth_query_interval=10000
      12. [isc]
      13. ip=127.0.0.1
      14. port=29300
      15. [mysql]
      16. server=localhost
      17. database=flyff
      18. username=***
      19. password=***[/COLOR]
      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

      Quellcode

      1. [COLOR=Red][server]
      2. ip=localhost
      3. port=28000
      4. minAccessLevel=0
      5. id=2
      6. owner=1
      7. name=Sarara
      8. data_path=..\Data
      9. log_path=Log
      10. use_gameguard=0
      11. gameguard_auth_query_interval=10000
      12. [isc]
      13. ip=127.0.0.1
      14. port=29300
      15. [mysql]
      16. server=localhost
      17. database=flyff
      18. username=***
      19. password=***[/COLOR]
      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

      Quellcode

      1. [COLOR=Red][server]
      2. ip=localhost
      3. port=15400
      4. minAccessLevel=0
      5. id=3
      6. owner=2
      7. channel_number=1
      8. name=Reinforce
      9. data_path=..\Data
      10. log_path=Log
      11. exprate=1.0
      12. fxprate=1.0
      13. droprate=1.0
      14. penyadroprate=1.0
      15. questdroprate=1.0
      16. motd=
      17. welcomemsg=Chibbie
      18. weather=2
      19. random_weather=0
      20. random_weather_interval=300000
      21. can_trade_quest_items=1
      22. can_drop_quest_items=1
      23. can_player_shop_quest_items=1
      24. can_mail_quest_items=1
      25. can_guild_bank_quest_items=1
      26. use_item_cooldown=0
      27. use_item_casting_timers=0
      28. use_action_slot_cooldown=0
      29. guild_rejoin_waiting_time=0
      30. #guild_rejoin_waiting_time=172800
      31. allowPK=0
      32. allowKS=1
      33. everywherePVP=1
      34. allowGuildBank=1
      35. precompile_nps_files=0
      36. dice_minigame_min_bet=100
      37. dice_minigame_max_bet=100000000
      38. dice_minigame_win_factor=5
      39. [isc]
      40. ip=localhost
      41. port=29300
      42. [mysql]
      43. server=localhost
      44. database=flyff
      45. username=***
      46. password=***[/COLOR]
      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
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • auch wenn ich glaube, dir ist dsa schon klar:
      wie fly schon sagte, ist das mein eigenes tut aus ingamers ;) ... bzw sammlug, oder nenn es wie du willst

      Und nein, ca 80-95% davon hab ich selbst geschrieben und rausinterpretiert^^
      Ich hab erst später den rest mit hilfe von den res dateien vervöllständigt.
      Den Thread hab ich noch geschrieben, als ich gerade erst in die Flyff Privat Server Szene eingestiegen bin. Ich hab mir praktisch also alles selber beigebracht. ;) Und erst später hab ich angefangen, mich in den res Files zu hause zu fiühlen. ^^
    • ich kan etwas zumindest helfen^^
      use_flyff_a=1
      hab ich auch keine ahnung von
      --->
      Ob man 1 ne flyff.a braucht um auf deinem server konecten zu könen.

      flyff_a_md5=
      Nicht bekannt
      -->
      das heist , ob 1 bestimmter md5 verschlüsselter code in der flyff.a sein muss um zu conecten , damit die spieler keinen älteren clienten benutzen könen , wo zb noch postkasten etc drin ist.

      wen man dan zb :
      flyff_a_md5=90d90aj28sa82h (ausgedacht)

      da stehen hat muss in der flyff.a datei auch dieser code drins tehen.

      wen nicht kommt ; bitte aktualisiere deinen clienten


      bei :
      gameguard_auth_query_interval=10000 die 10000 bedeutet wie oft das speil daten an den game guard senden muss damit keine hack meldung kommt.
      10000 = 10000ms ^^ is in ms angegeben aber da auf allen pservern
      use_gameguard=0 --> das heist ob das spiel überhaupt daten an game guard senden muss^^


      hoffe konte helfen
      mfg talvian