[Skript][Tutorial] Pfeilsorten-Auswahl | Mutli Arrow System
Grüße Community
Wollte mal zeigen, wie man unterschiedliche Pfeilsorten auswählen kann und mit demselben Bogen verschießen kann. Analog dazu kann man das Skript auch für Bolzen und Armbrüste übertragen.
Also, fangen wir direkt an:
Zuerst habe ich mir folgende Konstanten und Variablen in der Tuning_Ranged_Weapons.d angelegt
Code:
//Bögen
//Pfeilsorten Schadensbonus
const int Damage_Eisenpfeil = 10;
const int Damage_Feuerpfeil = 15;
const int Damage_Magiepfeil = 20;
//Variablen für die Funktionen
const int Munition = 0;
const int Bogen = 0;
Erklärung: Die Damage Konstanten geben an, wieviel zusätzlicher Schaden die Pfeile machen sollen (Gesamtschaden = Basis-Schaden des Bogens + Pfeilbonus).
Danach die beiden Integer 'Munition' und 'Bogen' brauche ich zur Unterscheidung zwischen den verschiedenen Iteminstanzen.
Als nächstes kommen die folgenden Funktionen ganz an den Anfang der IT_Ranged_Weapons.d:
Code:
// ****************
// Munition
// ****************
// Munitionswechsel
// die allgemeine Schadensaenderungs-Funktion, item ist global
FUNC VOID MunniwechselPfeil()
{
// In der Equip-Funktion des Bogens steht:
// Bogen = <Instanz des Bogens>;
// Npc_GetInvItem (self, Bogen);
// Npc_GetInvItem füllt die globale Variable 'item' mit dem entsprechendem Bogen
// Npc_HasItems kann auch verwendet werden, aber Achtung:
// die Funktion ist nicht GMP tauglich! Man kann den Munitionstyp ueber Talente abfangen,
// also zB Tiere ausweiden auf 0,1,2 oder 3 setzen.
// Hier wird abgefragt, ob man den Alternativen Munitionstyp dabei hat
if (Munition == 3) // Magische Pfeile
{
item.munition = ItRw_MagicArrow; // hier wird die Munitionsart festgelegt
item.damageTotal += Damage_Magiepfeil;
// Beim magischen Pfeil koennte man den Schadensbonus auch bei
// DAM_INDEX_MAGIC hinzufuegen (nicht abziehen vergessen! ;) )
item.damage[DAM_INDEX_BLUNT] = 0;
item.damage[DAM_INDEX_EDGE] = 0;
item.damage[DAM_INDEX_FLY] = 0;
item.damage[DAM_INDEX_MAGIC] = 0;
item.damage[DAM_INDEX_POINT] += Damage_Magiepfeil;
item.damage[DAM_INDEX_FIRE] = 0;
}
else if (Munition == 2) // Feuerpfeile
{
item.munition = ItRw_FireArrow;
item.damageTotal += Damage_Feuerpfeil;
item.damage[DAM_INDEX_BLUNT] = 0;
item.damage[DAM_INDEX_EDGE] = 0;
item.damage[DAM_INDEX_FLY] = 0;
item.damage[DAM_INDEX_MAGIC] = 0;
item.damage[DAM_INDEX_POINT] += Damage_Feuerpfeil;
item.damage[DAM_INDEX_FIRE] = 0;
}
else if (Munition == 1) // Eisenpfeile
{
item.munition = ItRw_ironArrow;
item.damageTotal += Damage_Eisenpfeil;
item.damage[DAM_INDEX_BLUNT] = 0;
item.damage[DAM_INDEX_EDGE] = 0;
item.damage[DAM_INDEX_FLY] = 0;
item.damage[DAM_INDEX_MAGIC] = 0;
item.damage[DAM_INDEX_POINT] += Damage_Eisenpfeil;
item.damage[DAM_INDEX_FIRE] = 0;
}
//Falls Munition = 0 ist, wird einfach wieder der normale Pfeil gesetzt
else // normale Pfeile
{
item.munition = ItRw_Arrow;
// kein Schadensbonus
};
};
// Und die Funktion, die beim Pfeil- oder Bogenwechsel den Schaden zuruecksetzt
// analog zu MunniwechselPfeil()
FUNC VOID MunniresetPfeil()
{
if (Munition == 3) // Magische Pfeile
{
item.munition = ItRw_MagicArrow;
item.damageTotal -= Damage_Magiepfeil;
item.damage[DAM_INDEX_BLUNT] = 0;
item.damage[DAM_INDEX_EDGE] = 0;
item.damage[DAM_INDEX_FLY] = 0;
item.damage[DAM_INDEX_MAGIC] = 0;
item.damage[DAM_INDEX_POINT] -= Damage_Magiepfeil;
item.damage[DAM_INDEX_FIRE] = 0;
}
else if (Munition == 2) // Feuerpfeile
{
item.munition = ItRw_FireArrow;
item.damageTotal -= Damage_Feuerpfeil;
item.damage[DAM_INDEX_BLUNT] = 0;
item.damage[DAM_INDEX_EDGE] = 0;
item.damage[DAM_INDEX_FLY] = 0;
item.damage[DAM_INDEX_MAGIC] = 0;
item.damage[DAM_INDEX_POINT] -= Damage_Feuerpfeil;
item.damage[DAM_INDEX_FIRE] = 0;
}
else if (Munition == 1) // Eisenpfeile
{
item.munition = ItRw_ironArrow;
item.damageTotal -= Damage_Eisenpfeil;
item.damage[DAM_INDEX_BLUNT] = 0;
item.damage[DAM_INDEX_EDGE] = 0;
item.damage[DAM_INDEX_FLY] = 0;
item.damage[DAM_INDEX_MAGIC] = 0;
item.damage[DAM_INDEX_POINT] -= Damage_Eisenpfeil;
item.damage[DAM_INDEX_FIRE] = 0;
}
else // normale Pfeile
{
item.munition = ItRw_Arrow;
};
Munition = 0;
};
Jetzt müssen wir nur noch bei den Munitionsarten und Bögen die Variablen Munition und Bogen mit den entsprechenden Werten füllen. Das machen wir mit on_equip Funktionen.
Bei den Pfeilen hab ich mir überlegt das Flag ITEM_AMULET zu setzen, da man immer nur ein Amulett gleichzeitig tragen kann und man so nicht mehrere Pfeilsorten gleichzeitig ausrüsten kann. Ich wette das lässt sich an dieser Stelle auch noch verbessern, indem man sich ein eigenes Flag definiert und so nicht den Amulett Slot mit Pfeilen belegt. Sobald ich mal Zeit dafür finde, werde ich das Skript hier updaten. Oder jemand weiß schon wie das geht und postet es als Kommentar, dann editiere ich das mit Credits auch hier rein
Also, so werden die Pfeilinstanzen gemacht:
Code:
// Munitionsarten
INSTANCE ItRw_Arrow(C_Item)
{
name = "Pfeil";
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_AMULET|ITEM_MULTI;
value = Value_Pfeil;
visual = "ItRw_Arrow.3ds";
material = MAT_WOOD;
on_equip = Equip_Arrow;
on_unequip = Unequip_Arrow;
description = name;
TEXT[4] = "Die Spitze ist aus Krallen oder Zähnen.";
TEXT[5] = "+0 Schaden";
INV_ZBIAS = INVCAM_ENTF_AMULETTE_STANDARD;
};
FUNC VOID Equip_Arrow()
{
Munition = 0; // Munition Variable wird gesetzt
Npc_GetInvItem (self, Bogen); //füllt die globale Variable 'item' mit dem entsprechendem Bogen
MunniwechselPfeil(); // Aufruf der Schadensaenderungsfunktion
};
// analog zu Equip_Arrow()
FUNC VOID Unequip_Arrow()
{
Npc_GetInvItem (self, Bogen);
MunniresetPfeil(); // wichtig: Schaden wird zurueckgesetzt
};
Die anderen Pfeilsorten werden ganz analog dazu erstellt.
Und zu guter Letzt noch die Funktionen für die Bögen:
Hier gebe ich nur ein Beispiel an, wie es am Kurzbogen gemacht wird. Die Funktionen kann man sich ganz analog zu den anderen Bögen schreiben.
Vielleicht findet man das Skript ja in der ein oder anderen Mod wieder. Würde mich freuen.
[Bild: spineSignature.php?name=Migos]
Entwickler von Jharkendar-Online Deathmatch & Roleplay (zu finden in Spine).
Komm doch auf unseren Discord und lerne unsere nette Community kennen.
Mal gucken, was gerade entwickelt wird? Hier ist unsere Roadmap.
Hi Milgo,
Wir haben uns ja viel mit unseren Multi-Pfeil System versucht.
Bei deiner Version sollte man beachten, das der Pfeil nur gewechselt wird, wenn der Bogen nicht angelegt ist.
Ansonsten wirft die Engine den ein oder anderen Pfeil in die Gegend, oder der Held steht mit einen Pfeil in der Hand da, weigert sich aber den abzuschiessen.
Die Engine ist sehr eigenwillig wenn es um Pfeile geht.
Selbst in unsere aktuellen Version, wird der Bogen kurzfristig weggesteckt, wenn der Pfeil bei angelegten Bogen gewechselt wird.
Noraser
MOD: JURAN 1.4.6 Juran 1.5 Fertig: Sprachdateien 99%, Videos 50%, Weg der Magie (done), Weg des Geschicks (90%)
Man könnte vllt. mit nem Overlay die Bogen Zieh- und Wegsteck-Animation auf 0 oder 1 frame überladen, sodass man höchstens ein kurzes Flackern sieht. Aber der Npc den Bogen "gefühlt" nicht wegsteckt.
Hallo Migox, überrascht dich hier zu sehen.
Hast du die Pfeilsorten im GMP umgesetzt? Da müsste es doch mordsmäßige Synchronisationsprobleme geben, weil die gestreamten Spieler mit Standardmunition dargestellt werden.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Super, genau so etwas habe ich gebraucht. Wollte das vor einiger Zeit auch schon mal in Velen einbauen, wusste nur nicht genau wie. Danke.
Aber ich habe dazu auch gleich mal eine Frage, bei der ich mir nicht sicher war, ob ich einen extra Thread dafür aufmachen soll, weil das ja so gut dazu passt:
Ich wollte einen Gothic 3 ähnlichen "Kopfnuss" Pfeil skripten, der also nicht tötet, sondern den Gegner nur bewusstlos machen soll. Ich habe schon einiges probiert, z.B. einfach den damagetype des Bogens per Skript (bzw. der Funktion MunniwechselPfeil()) in DAM_BLUNT zu ändern (item.damagetype = DAM_BLUNT) oder das mainflag zu ändern (item.mainflag = XXX). Aber nichts davon hat funktioniert. Beim mainflag hab ich verschiedenes getestet, z.B. ITEM_KAT_NF und ITEM_KAT_RUNE, was aber beides nicht funktioniert hat (ist ja eigentlich klar. ^^). Wäre so ein nicht tödlicher Pfeil überhaupt möglich? Weil ich denke, dafür müsste ich ja ein neues mainflag erstellen (geht das überhaupt so einfach?) und dann per Pfeilskript das item.mainflag ändern?
Bei deiner Version sollte man beachten, das der Pfeil nur gewechselt wird, wenn der Bogen nicht angelegt ist.
Das stimmt. Da die Pfeile hier das Amulett-Flag haben, muss man aber sowieso in das Inventar gehen, wenn man die Pfeile wechseln möchte. Sobald man in das Inventar geht, geht man ja automatisch aus der Kampfstellung heraus. Daher dürfte das deine beschriebenen Bugs vermeiden.
Zitat von Bisasam
Hallo Migox, überrascht dich hier zu sehen.
Hast du die Pfeilsorten im GMP umgesetzt? Da müsste es doch mordsmäßige Synchronisationsprobleme geben, weil die gestreamten Spieler mit Standardmunition dargestellt werden.
Ja, die Pfeilsorten sind umgesetzt. Aktuell lassen die sich nur auf CK bewundern, aber unser Deathmatch und zukünftiger RP Server werden die bald auch haben.
Synchronisationsprobleme mit dem Schaden gab es keine. Allerdings hat der GMP allgemein ein Problem mit der Darstellung von Munition bei anderen Spielern. Egal ob Standard Pfeile oder eigene Munition, sie werden nicht angezeigt.
Zitat von Bloodfly91
Super, genau so etwas habe ich gebraucht. Wollte das vor einiger Zeit auch schon mal in Velen einbauen, wusste nur nicht genau wie. Danke.
Aber ich habe dazu auch gleich mal eine Frage, bei der ich mir nicht sicher war, ob ich einen extra Thread dafür aufmachen soll, weil das ja so gut dazu passt:
Ich wollte einen Gothic 3 ähnlichen "Kopfnuss" Pfeil skripten, der also nicht tötet, sondern den Gegner nur bewusstlos machen soll. Ich habe schon einiges probiert, z.B. einfach den damagetype des Bogens per Skript (bzw. der Funktion MunniwechselPfeil()) in DAM_BLUNT zu ändern (item.damagetype = DAM_BLUNT) oder das mainflag zu ändern (item.mainflag = XXX). Aber nichts davon hat funktioniert. Beim mainflag hab ich verschiedenes getestet, z.B. ITEM_KAT_NF und ITEM_KAT_RUNE, was aber beides nicht funktioniert hat (ist ja eigentlich klar. ^^). Wäre so ein nicht tödlicher Pfeil überhaupt möglich? Weil ich denke, dafür müsste ich ja ein neues mainflag erstellen (geht das überhaupt so einfach?) und dann per Pfeilskript das item.mainflag ändern?
Freut mich zu hören, dass das Skript direkt Anklang findet
Du könntest bei deinem Kopfnuss Pfeil item.damageTotal = 0 setzen, dann macht der Bogen zumindest schonmal keinen Schaden. Dann musst du nur noch herausfinden, wie man den Attributs-Schaden vom Hero selbst eliminiert und anschließend einen Weg finden, wie man deinen gewünschten Stun/Knockout-Effekt scriptet. Dafür kenne ich mich aber zu wenig mit Daedalus aus.
[Bild: spineSignature.php?name=Migos]
Entwickler von Jharkendar-Online Deathmatch & Roleplay (zu finden in Spine).
Komm doch auf unseren Discord und lerne unsere nette Community kennen.
Mal gucken, was gerade entwickelt wird? Hier ist unsere Roadmap.
Freut mich zu hören, dass das Skript direkt Anklang findet
Du könntest bei deinem Kopfnuss Pfeil item.damageTotal = 0 setzen, dann macht der Bogen zumindest schonmal keinen Schaden. Dann musst du nur noch herausfinden, wie man den Attributs-Schaden vom Hero selbst eliminiert und anschließend einen Weg finden, wie man deinen gewünschten Stun/Knockout-Effekt scriptet. Dafür kenne ich mich aber zu wenig mit Daedalus aus.
Eigentlich keine schlechte Idee. Aber dann macht der Bogen/Pfeil ja gar keinen Schaden mehr? Eigentlich soll er ja schon noch normalen Schaden machen, nur nicht töten. Ich glaube ich werde dafür trotzdem nochmal einen extra Thread aufmachen. ^^
Mir ist auch noch ein Bug aufgefallen: Wenn man einen Spielstand lädt und einen Bogen mit Pfeil angelegt hatte, muss man immer beides nochmal ablegen und wieder anlegen in der Reihenfolge: Bogen --> Pfeil. Sonst zieht der Held den Bogen nicht mehr.
Edit: Gleiches Problem wenn man erst die Pfeile anlegt und dann erst den Bogen.
Mir ist auch noch ein Bug aufgefallen: Wenn man einen Spielstand lädt und einen Bogen mit Pfeil angelegt hatte, muss man immer beides nochmal ablegen und wieder anlegen in der Reihenfolge: Bogen --> Pfeil. Sonst zieht der Held den Bogen nicht mehr.
Edit: Gleiches Problem wenn man erst die Pfeile anlegt und dann erst den Bogen.
Ich wollte den Thread nochmal aus der Versenkung holen. Ich will ein System zur Auswahl von Pfeilsorten gerne in meine private Mod einbauen.
Hat jemand in den letzten Jahren ggf. einen fehlerfreien Code entwickeln können, der keine Bugs verursacht?
Damit wird im Inventar immer die Ausgerüstete Pfeilsorte angezeigt (Rotes Kästchen, wie bei Waffen)
Es wird im Spielstand gespeichert, welcher Pfeil/Bolzen ausgerüstet ist.
Ausgerüstet wird über das "anlegen" des Pfeils/Bolzens. Kann aber nach belieben gemacht werden.
Wichtig ist nur, das "X_UpdateMunition_Bow" oder respektive "X_UpdateMunition_Crossbow" korrekt aufgerufen wird.
UpdateMunition.d (Irgendwo vor den Items parsen, nach LeGo & Ikarus)
Spoiler:(zum lesen bitte Text markieren)
Code:
/*
-- Story_Globals.d
var int SC_Equipped_Arrow;
var int SC_Equipped_Bolt;
*/
const int X_AMMO_RESET = -1;
func void X_UpdateMunition_SetInactiveAll(var C_NPC slf) {
var int i; i = 0;
while(TRUE);
if (NPC_GetInvItemBySlot(slf, ITEM_KAT_MUN, i) == 0) { return; };
if (!Hlp_IsValidItem(item)) { return; };
if ((item.mainflag & ITEM_KAT_MUN) == 0) { i+=1; continue; };
if (item.flags & ITEM_MULTI) {
if (item.flags & (ITEM_CROSSBOW | ITEM_BOW)) {
item.flags = item.flags & ~(ITEM_ACTIVE_LEGO);
};
};
i+=1;
end;
};
func void X_UpdateMunition_Bow(var C_NPC slf, var int instAmmoParam) {
var C_ITEM bow;
var int instAmmo; instAmmo = instAmmoParam;
if (Npc_IsPlayer(slf)) {
if (SC_Equipped_Arrow != ItRw_Arrow)
&& (SC_Equipped_Arrow != ItRw_Addon_FireArrow)
&& (SC_Equipped_Arrow != ItRw_Addon_MagicArrow)
{
SC_Equipped_Arrow = ItRw_Arrow;
};
if (instAmmoParam == X_AMMO_RESET) {
instAmmo = SC_Equipped_Arrow;
};
X_UpdateMunition_SetInactiveAll(slf);
SC_Equipped_Arrow = instAmmo;
};
if (Npc_IsInfightMode(slf, FMODE_FAR)) { bow = Npc_GetReadiedWeapon(slf); }
else if (Npc_HasEquippedRangedWeapon(slf)) { bow = Npc_GetEquippedRangedWeapon(slf); }
else { return; };
if (Hlp_IsValidItem(bow)) {
if (bow.flags & ITEM_BOW) {
bow.munition = instAmmo;
if (Npc_IsPlayer(slf)) {
if (Npc_GetInvItem(slf, instAmmo)) {
if (instAmmoParam != X_AMMO_RESET) {
X_Print(TextSpaceText(item.description, TEXT_CONCAT_EQUIPPED));
};
item.flags = item.flags | ITEM_ACTIVE_LEGO;
};
};
};
};
};
func void X_UpdateMunition_Crossbow(var C_NPC slf, var int instAmmoParam) {
var C_ITEM cbow;
var int instAmmo; instAmmo = instAmmoParam;
if (Npc_IsPlayer(slf)) {
if (SC_Equipped_Bolt != ItRw_Bolt)
&& (SC_Equipped_Bolt != ItRw_Addon_MagicBolt)
{
SC_Equipped_Bolt = ItRw_Bolt;
};
if (instAmmoParam == X_AMMO_RESET) {
instAmmo = SC_Equipped_Bolt;
};
X_UpdateMunition_SetInactiveAll(slf);
SC_Equipped_Bolt = instAmmo;
};
if (Npc_IsInfightMode(slf, FMODE_FAR)) { cbow = Npc_GetReadiedWeapon(slf); }
else if (Npc_HasEquippedRangedWeapon(slf)) { cbow = Npc_GetEquippedRangedWeapon(slf); }
else { return; };
if (Hlp_IsValidItem(cbow)) {
if (cbow.flags & ITEM_CROSSBOW) {
cbow.munition = instAmmo;
if (Npc_IsPlayer(slf)) {
if (Npc_GetInvItem(slf, instAmmo)) {
if (instAmmoParam != X_AMMO_RESET) {
X_Print(TextSpaceText(item.description, TEXT_CONCAT_EQUIPPED));
};
item.flags = item.flags | ITEM_ACTIVE_LEGO;
};
};
};
};
};
/// Gehandled über `_X_UpdateMunition_InitUpdate`
func void _X_UpdateMunition_FF() {
if (!MEM_Game.timeStep) { return; };
if (!Hlp_IsValidNpc(hero)) { return; };
if (SC_Equipped_Bolt != 0) {
X_UpdateMunition_Crossbow(hero, X_AMMO_RESET);
} else {
X_UpdateMunition_Bow(hero, X_AMMO_RESET);
};
RemoveHookF(oCGame__Render, 0, _X_UpdateMunition_FF);
};
func void _X_UpdateMunition_InitUpdate() {
HookEngineF(oCGame__Render, 7, _X_UpdateMunition_FF);
};
func void X_UpdateMunition_EquipBow() {
if (!Npc_IsPlayer(self)) { return; };
SC_Equipped_Bolt = 0;
_X_UpdateMunition_InitUpdate();
};
func void X_UpdateMunition_UnEquipBow() {
if (!Npc_IsPlayer(self)) { return; };
X_UpdateMunition_SetInactiveAll(self);
};
func void X_UpdateMunition_EquipCrossbow() {
if (!Npc_IsPlayer(self)) { return; };
SC_Equipped_Arrow = 0;
_X_UpdateMunition_InitUpdate();
};
func void X_UpdateMunition_UnEquipCrossbow() {
if (!Npc_IsPlayer(self)) { return; };
X_UpdateMunition_SetInactiveAll(self);
};
Was ist der Sinn hinter der Variable slf in _Hook_oCNpc__OpenInventory_UpdateItems -- die wird gar nicht benutzt?
Vermutlich wird es hier auch passieren, dass man nach (größeren) Änderungen an den Skripten die Pfeile wieder neu auswählen muss, weil sich die Pfeilinstanz verschoben hat und so die Variable nicht mehr auf die richtige Instanz zeigt? Ist hier nur als Hinweis gedacht, damit sich der Modder beim Testen alter Spielstände nicht wundert.
Was ist der Sinn hinter der Variable slf in _Hook_oCNpc__OpenInventory_UpdateItems -- die wird gar nicht benutzt?
Vermutlich wird es hier auch passieren, dass man nach (größeren) Änderungen an den Skripten die Pfeile wieder neu auswählen muss, weil sich die Pfeilinstanz verschoben hat und so die Variable nicht mehr auf die richtige Instanz zeigt? Ist hier nur als Hinweis gedacht, damit sich der Modder beim Testen alter Spielstände nicht wundert.
Jop. Probleme beim Verschieben von Instanzen kann es geben, bei tests mit älteren Spielständen.
Könnte man entsprechend anpassen und gucken ob der aktuelle "ausgerüstete" Instanz-Index überhaupt noch den ItRw... entspricht und ansonsten direkt reset auf standard.
Man könnte zwar versuchen zu schummeln, indem man den Instanz-namen verwendet (und mit den Ikarus Parser funktionen arbeitet), aber auch der kann verändert werden. Unwahrscheinlich, aber kann passieren.
Danke für den Hinweis mit slf, war ein überbleibsel.
Paar Sachen noch:
1: Kann es sein, dass die X_Print Funktion von dir definiert ist? Ich bekomme diesbezüglich nämlich einen Fehler beim Parsen.
2: SCHEME_EQUIPITEM wird mir ebenfalls als unbekannt angezeigt.
3: Muss die Adresse oCNpc__OpenInventory nicht irgendwo definiert sein?
Paar Sachen noch:
1: Kann es sein, dass die X_Print Funktion von dir definiert ist? Ich bekomme diesbezüglich nämlich einen Fehler beim Parsen.
2: SCHEME_EQUIPITEM wird mir ebenfalls als unbekannt angezeigt.
3: Muss die Adresse oCNpc__OpenInventory nicht irgendwo definiert sein?
Natürlich... Da habe ich mal wieder nicht ganz aufgepasst
1. Jop, kann durch beliebige text-darstellung ausgetauscht werden (z.B. "Print" )
2. SCHEME_EQUIPITEM ist eine "const string SCHEME_EQUIPITEM = "MAP"; "
3. Ist definiert in der "LeGo\EngineAdr_G2.d"
Natürlich... Da habe ich mal wieder nicht ganz aufgepasst
1. Jop, kann durch beliebige text-darstellung ausgetauscht werden (z.B. "Print" )
2. SCHEME_EQUIPITEM ist eine "const string SCHEME_EQUIPITEM = "MAP"; "
3. Ist definiert in der "LeGo\EngineAdr_G2.d"
Ich bessere den Beitrag oben heute abend aus.
Alles klar. Und die Funktion TextSpaceText verkettet wahrscheinlich nur zwei Strings mit einem Leerzeichen dazwischen oder?
TEXT_CONCAT_EQUIPPED wäre dann nur noch undefiniert.
Alles klar. Und die Funktion TextSpaceText verkettet wahrscheinlich nur zwei Strings mit einem Leerzeichen dazwischen oder?
TEXT_CONCAT_EQUIPPED wäre dann nur noch undefiniert.
Jop. Genau das macht sie
und TEXT_CONCAT_EQUIPPED ist "ausgerüstet"
Ich habe das Skript oben entsprechend angepasst. Sollte nun hoffentlich Portabel sein. Kann es leider erst gegen heute abend testen.