Cześć wszystkim.
Mam problem z kopaniem rudy, otóż wzorowałem się na tych tematach + tym co jest w skryptach samego Gothica
https://themodders.org/index.php?topic=23954.0 <- Temat Gravier'a
https://themodders.org/index.php?topic=16949.msg1032218#msg1032218 <- Temat Toworish'a
Wstawiam kod żeby ktoś mógł zweryfikować czy jest ok.
Plik OreMining.d
Spoiler
FUNC INT B_MagicOreMob_Target ()
{
if Hlp_StrCmp (Npc_GetNearestWP (self), "XARDAS_MINING_TEST") && (MagicOreMob_01_Amount_MAX > MagicOreMob_01_Amount)
{
MagicOreMob_01_Amount = (MagicOreMob_01_Amount + 1);
return TRUE;
};
return FALSE;
};
FUNC VOID OreMining_S1 ()
{
var C_NPC her; her = Hlp_GetNpc(PC_Hero);
if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
{
self.aivar[AIV_INVINCIBLE] = TRUE;
PLAYER_MOBSI_PRODUCTION = MOBSI_OREMINING;
Ai_ProcessInfos (her);
};
};
INSTANCE PC_OreMining_End (C_Info)
{
npc = PC_Hero;
nr = 999;
condition = PC_OreMining_End_Condition;
information = PC_OreMining_End_Info;
permanent = TRUE;
description = DIALOG_ENDE;
};
FUNC INT PC_OreMining_End_Condition ()
{
if (PLAYER_MOBSI_PRODUCTION == MOBSI_OREMINING)
{
return TRUE;
};
};
FUNC VOID PC_OreMining_End_Info ()
{
Remains_Count = 0;
B_ENDPRODUCTIONDIALOG ();
};
INSTANCE PC_OreMining_Hour (C_Info)
{
npc = PC_Hero;
nr = 2;
condition = PC_OreMining_Hour_Condition;
information = PC_OreMining_Hour_Info;
permanent = TRUE;
description = "Odłup trochę.";
};
FUNC INT PC_OreMining_Hour_Condition ()
{
if (PLAYER_MOBSI_PRODUCTION == MOBSI_OREMINING)
{
return TRUE;
};
};
var int MagicOreCounter;
FUNC VOID PC_OreMining_Hour_Info ()
{
Learn_mining_by_doing = (Learn_mining_by_doing + 1);
if (Learn_mining_by_doing == 10)
{
B_Upgrade_Hero_DigChance (2);
}
else if (Learn_mining_by_doing == 15)
{
B_Upgrade_Hero_DigChance (3);
}
else if (Learn_mining_by_doing == 20)
{
B_Upgrade_Hero_DigChance (5);
};
var int CurrentChance;
CurrentChance = Hlp_Random (100);
var int MultiNugget;
MultiNugget = Hlp_Random (10);
if (B_MagicOreMob_Target() == TRUE)
{
if (CurrentChance <= Hero_DigChance)
{
if (MagicOreCounter >= 20)
&& (MultiNugget >= 8)
{
CreateInvItems (hero, ItMi_Nugget, 3);
PrintScreen ("Odpadły 3 kawałki rudy!", -1, -1, FONT_ScreenSmall, 2);
Remains_Count = 0;
}
else if (MagicOreCounter >= 7)
&& (MultiNugget >= 5)
{
CreateInvItems (hero, ItMi_Nugget, 2);
PrintScreen ("Odpadły 2 kawałki rudy!", -1, -1, FONT_ScreenSmall, 2);
Remains_Count = 0;
MagicOreCounter = (MagicOreCounter + 1);
}
else
{
CreateInvItems (hero, ItMi_Nugget, 1);
PrintScreen ("Odpadł 1 kawałek rudy!", -1, -1, FONT_ScreenSmall, 2);
Remains_Count = 0;
MagicOreCounter = (MagicOreCounter + 1);
};
}
else
{
PrintScreen ("Kawałki złota zasypują okolicę...", -1, -1, FONT_ScreenSmall, 2);
Remains_Count = (Remains_Count + 1);
};
}
else
{
PrintScreen ("Nic nie zostało.", -1, -1, FONT_ScreenSmall, 2);
B_ENDPRODUCTIONDIALOG ();
};
};
INSTANCE PC_OreMining_HardDig (C_Info)
{
npc = PC_Hero;
nr = 997;
condition = PC_OreMining_HardDig_Condition;
information = PC_OreMining_HardDig_Info;
permanent = TRUE;
description = "Mocno uderz.";
};
FUNC INT PC_OreMining_HardDig_Condition ()
{
if (PLAYER_MOBSI_PRODUCTION == MOBSI_OREMINING)
&& (Remains_Count >= 2)
&& (Knows_HardDig == TRUE)
{
return TRUE;
};
};
FUNC VOID PC_OreMining_HardDig_Info()
{
var int HardDigChance;
HardDigChance = Hlp_Random (100);
if (HardDigChance < 5)
{
PrintScreen ("Nic...", -1, -1, FONT_ScreenSmall, 2);
}
else
{
Snd_Play ("RAVENS_EARTHQUAKE3");
Wld_PlayEffect("FX_EarthQuake", self, self, 0, 0, 0, FALSE );
if (HardDigChance >= 85)
{
CreateInvItems (hero, ItMi_Nugget, 3);
PrintScreen ("Odpadły 3 kawałki rudy!", -1, -1, FONT_ScreenSmall, 2);
}
else if (HardDigChance >= 50)
{
CreateInvItems (hero, ItMi_Nugget, 2);
PrintScreen ("Odpadły 2 kawałki rudy!", -1, -1, FONT_ScreenSmall, 2);
}
else
{
CreateInvItems (hero, ItMi_Nugget, 1);
PrintScreen ("Odpadł 1 kawałek rudy!", -1, -1, FONT_ScreenSmall, 2);
};
};
Remains_Count = 0;
};
INSTANCE PC_OreMining_Chance (C_Info)
{
npc = PC_Hero;
nr = 998;
condition = PC_OreMining_Chance_Condition;
information = PC_OreMining_Chance_Info;
permanent = TRUE;
description = "(Ocena zdolności)";
};
FUNC INT PC_OreMining_Chance_Condition ()
{
if (PLAYER_MOBSI_PRODUCTION == MOBSI_OREMINING)
{
return TRUE;
};
};
FUNC VOID PC_OreMining_Chance_Info()
{
var string ConcatText;
if (Hero_DigChance < 20)
{
ConcatText = ConcatStrings ("nieopierzony żółtodziób (", IntToString (Hero_DigChance));
}
else if (Hero_DigChance < 40)
{
ConcatText = ConcatStrings ("przeciętny kopacz (" , IntToString (Hero_DigChance));
}
else if (Hero_DigChance < 55)
{
ConcatText = ConcatStrings ("doświadczony kopacz (", IntToString (Hero_DigChance));
}
else if (Hero_DigChance < 75)
{
ConcatText = ConcatStrings ("urodzony kopacz ( ", IntToString (Hero_DigChance));
}
else if (Hero_DigChance < 90)
{
ConcatText = ConcatStrings ("piekielnie dobry kopacz ( ", IntToString (Hero_DigChance));
}
else if (Hero_DigChance < 98)
{
ConcatText = ConcatStrings ("mistrz kopania ( ", IntToString (Hero_DigChance));
}
else
{
ConcatText = ConcatStrings ("guru kopaczy ( ", IntToString (Hero_DigChance));
};
ConcatText = ConcatStrings (concatText, " procent)");
PrintScreen (concatText, -1, -1, FONT_ScreenSmall,2);
};
Plik B_Upgrade_Hero_DigChance.d
Spoiler
FUNC VOID B_Upgrade_Hero_DigChance (var int value)
{
var string concatText;
concatText = ConcatStrings (PRINT_DLC_DIGCHANCE, IntToString(value));
concatText = ConcatStrings (concatText, ")");
PrintScreen (concatText, -1, 34, FONT_ScreenSmall, 2);
Hero_DigChance = (Hero_DigChance + value);
Snd_Play ("Geldbeutel");
};
No i teraz tak:
Zrobiłem dokładnie tak jak było opisane to w tych tematach co znalazłem.
Po kolei:
1. Wstawiałem zmienne tam gdzie być powinny czyli:
Hero_DigChance = 10; - w pliku Startup.d wewnątrz funkcji FUNC VOID STARTUP_NewWorld()
var int Hero_DigChance;
var int Remains_Count;
var int Knows_HardDig;
var int Learn_mining_by_doing;
var int MagicOreMob_01_Amount;
const int MagicOreMob_01_Amount_MAX = 5;
W Story_Globals.d na samym dole (Tak dodałem ENTER na końcu)
const int MOBSI_OREMINING = 8; - Pod pozostałymi MOBSI w pliku AI_Constants.d
const string DIALOG_DLC_MAGICORE_DESCRIPTION = "Co muszę wiedzieć o wydobyciu rudy?";
const string PRINT_DLC_DIGCHANCE = "Zwiększyła się umiejętność wydobywania rudy! (+";
W pliku Text.d też na końcu przed ENTEREM
STORY\B_Content\B_Upgrade_Hero_DigChance.d - W tym samym miejscu gdzie ścieżka do oryginalnego pliku
Wszystkie pliki są umieszczone w tych samych folderach.
2. Dodałem w spacerze interesującą mnie żyłę tak jak na obrazku, dodałem obok niej Waypointa
Freepointa połączonego z innym aby była ścieżka (podobnie jak w AddonWorld.zen)
https://imgur.com/wKNnWKa3. Zapisałem zena wczytałem żeby sprawdzić czy wszystko OK i jest.
4. Potem Naprawa skryptów
5. Na wszelki wypadek utworzyłem na nowo OU.BIN i OU.CSL Redefixem
6. Utworzyłem na nowo paczkę z modem
7. Odpaliłem nową grę i tu zaczyna się ten problem...
Po interakcji z rudą nic się nie wyświetla. Po prostu wygląda to tak jak bym nic nie zrobił. Znaczy kopać kopie (Animacja kopania itp.) ale nie działa to tak jak przy kopaniu złota czyli przy interakcji z Bryłą złota otwiera się dialog kopania.
Pomoże ktoś? Może ktoś już to ogarnął? Szukałem trochę w necie czy poza tymi dwoma tematami ktoś jeszcze nie próbował tego rozwiązać.