Wczytanie zapisu resetuje skalowanie obrażeń ze zręką. 2751 10

O temacie

Autor Lobos

Zaczęty 18.06.2021 roku

Wyświetleń 2751

Odpowiedzi 10

Lobos

Lobos

Użytkownicy
posty594
Propsy360
Profesjabrak
  • Użytkownicy
Przerobiłem skrypt od BognadaZwei (http://themodders.org/index.php?topic=23935.0) pod siebie, żeby móc skalować moje wybrane miecze ze zręcznością zamiast z siłą, zachowując przy tym oryginalną formułę obrażeń z G2NK. Skrypt działa po uruchomieniu nowej gry, z tym, że po wczytaniu zapisu przestaje już działać i moje bronie znów skalują się z siłą. Czyli tak jakby skrypt nie jest już wtedy wywoływany. Trzeba go podpinać do framefunction czy co?


To mój skrypt. Dodałem go na górę do startup.d
func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg)
{
var c_item weapon;
weapon = Npc_GetReadiedWeapon(other);
var int weaponDmg;
weaponDmg = weapon.damageTotal;
    var int armor;
var int CritChances; CritChances = r_Max(100);
var c_npc slf; slf = _^(victimPtr);
var c_npc oth; oth = _^(attackerptr);

if weapon.damagetype == DAM_EDGE
{
armor = slf.protection[PROT_EDGE];
}
else if weapon.damagetype == DAM_POINT
{
armor = slf.protection[PROT_POINT];
};

if (Hlp_IsItem(weapon, ItMw_1h_Vlk_Sword))
||(Hlp_IsItem(weapon, ItMw_Sztyleciak))
{
if (Npc_IsPlayer (hero))
{
var int damage; damage = weaponDmg + oth.attribute[ATR_DEXTERITY];
if (CritChances<=oth.hitchance[1])
{
dmg = damage - armor;
PrintScreen ("Kryt", -1, -1, FONT_Screen, 2);
}
else
{
dmg = (damage - armor - 1)/10;
PrintScreen ("Zwykły hit", -1, -1, FONT_Screen, 2);
};
};

};

return dmg;
};


func void _DMG_OnDmg() {
EDI = DMG_OnDmg(EBP, MEM_ReadInt(MEM_ReadInt(ESP+644)+8), EDI);
};
func void InitDamage() {
const int dmg = 0;
if (dmg) { return; };
HookEngineF(6736583/*0x66CAC7*/, 5, _DMG_OnDmg);
dmg = 1;
};

 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
W jakis sposób jest inicjowany hook?
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Lobos

Lobos

Użytkownicy
posty594
Propsy360
Profesjabrak
  • Użytkownicy
Dodałem to InitDamage() pod   LeGo_Init(LeGo_All  ); w startup_global w startup.d i w zasadzie to tyle.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
No to już wszystko wiadomo. Nie inicjuje się tego typu funkcji w startupie, bo startup jest wywoływany tylko przy pierwszym wczytaniu świata by umieścić w nim npc. Inicjuj w funkcji Init_Global
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
Poza tym chciałbym zauważyć, że if (Npc_IsPlayer (hero)) nie ma sensu, bo globalna instancja gracza to zawsze gracz.
Jak chcesz to tylko dla hero, to tam am być oth, chociaż nw czy to ma sens.
Poza tym polecałbym dać na początku if(!attackerPtr) {return dmg;};, bo jak gracz spada na ziemie i otrzymuje dmg, to atakujący to null.
 
while(false) Do();

Lobos

Lobos

Użytkownicy
posty594
Propsy360
Profesjabrak
  • Użytkownicy
Przepraszam, pomyliłem się. Właśnie miałem to zainicjowane w Init_global w startupie

func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
Game_InitGerman();

// Ikarus initialisieren
    MEM_InitAll();

    // LeGo initialisieren
    LeGo_Init(LeGo_All  );
InitDamage();

GFA_Init(GFA_ALL & ~GFA_REUSE_PROJECTILES);

if (!FF_Active (Zbieranie_podWoda))
{
FF_ApplyOnceExt (Zbieranie_podWoda, 100, -1); //10 razy na sekunde
//FF_ApplyOnce (B_MojaFunkcja, 1000, -1);//raz na sekunde
//FF_ApplyOnce (B_MojaFunkcja, 10000, -1);//raz na 10 sekund
};


};

bogu
Masz rację, miałem właśnie wywalić to if z NPC_isPlayer ale zająłem się głównym problemem. Dzięki za pozostałe wskazówki.

wolne celowanie działa nawet po wczytaniu, a funkcja dmg niestety już nie.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
weapon = Npc_GetReadiedWeapon(other);Other i self są przypisywanie przez silnik przy wywoływaniu niektórych externali. Przy wczytaniu gry other to również null.

Ogólnie skrypt ma kilka błędów. Poprawiłem trochę

func int DMG_OnDmg(var int victimPtr, var int attackerPtr, var int dmg)
{
if (!attackerptr) {
return;
};

var c_npc slf; slf = _^(victimPtr);
var c_npc oth; oth = _^(attackerptr);
var c_item weapon; weapon = Npc_GetReadiedWeapon(oth);
var int weaponDmg; weaponDmg = weapon.damageTotal;
var int armor;


if weapon.damagetype & DAM_EDGE
{
armor = slf.protection[PROT_EDGE];
}
else if weapon.damagetype & DAM_POINT
{
armor = slf.protection[PROT_POINT];
};

if (Hlp_IsItem(weapon, ItMw_1h_Vlk_Sword))
||(Hlp_IsItem(weapon, ItMw_Sztyleciak))
{
var int damage; damage = weaponDmg + oth.attribute[ATR_DEXTERITY];
var int CritChances; CritChances = r_Max(100);

if (CritChances<=oth.hitchance[1])
{
dmg = damage - armor;
PrintScreen ("Kryt", -1, -1, FONT_Screen, 2);
}
else
{
dmg = (damage - armor - 1)/10;
PrintScreen ("Zwykły hit", -1, -1, FONT_Screen, 2);
};

};

return dmg;
};

 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Lobos

Lobos

Użytkownicy
posty594
Propsy360
Profesjabrak
  • Użytkownicy
No i działa :) Wielkie dzięki. Jak zjem to przestudiuję, co ty tam pozmieniałeś, że to już działa po wczytaniu. Jeszcze sprawdzę parę razy jak ten skrypt działa jak bijemy w NPC z załozonym pancerzem bo póki co tesowałem na characterhelperze.

Mam jeszcze kilka pytań.

1. Czy ta funkcja nie wpłynie znacząco na płynność gry? Z mojej perspektywy to całkiem sporo obliczeń przed każdym zadanym ciosem podczas walki.
2. W tym if'ie który dopisałeś splash if (!attackerptr) {
return;
};
trzeba wpisać return dmg; ? Bo po samym return; gra wywala do pulpitu i jest exception ; Ale jak dałem return dmg; to jest już ok. Nie chcę, żeby później stało się coś nieoczekiwanego czego nie będę umiał naprawić.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Cytuj
trzeba wpisać return dmg; ?
yeah, my bad
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

rom4ntic

rom4ntic

Użytkownicy
posty5
Profesjabrak
  • Użytkownicy
Siemka, niestety nie jestem obeznany w temacie kodów, skryptów itp. Powie mi ktoś może jak mam dodać to do gry żeby bronie skalowały się ze zręcznością?
 

Khantor

Khantor

Użytkownicy
posty59
Propsy12
Profesjabrak
  • Użytkownicy
Siemka, niestety nie jestem obeznany w temacie kodów, skryptów itp. Powie mi ktoś może jak mam dodać to do gry żeby bronie skalowały się ze zręcznością?

Ogarniasz ten temat
https://themodders.org/index.php?topic=16580.0i robisz wg instrukcji (pobierasz oczywiście najnowsze wersje skryptów jakie obecnie są, bo temat trochę ma a nie wiem czy był aktualizowany, pewnie nie.

Następnie ogarniasz ten temat
http://themodders.org/index.php?topic=23935.0I znowu robisz wg instrukcji. Zamiast kodu Bogdan Zwei wstawiasz ten Lobosa z poprawkami Splasha, napisane masz nawet gdzie tą funkcję i jak zainicjować. Większej filozofii w tym nie ma.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry