1
Zapowiedzi modyfikacji / [G2NK] Requiem
« dnia: 2023-09-17, 13:00 »https://www.youtube.com/watch?v=nxwUVlr3E94
Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.
var oCNpc _hero; _hero = Hlp_GetNpc(PC_HERO);
var c_npc pNpc; pNpc = MEM_PtrToInst(_hero.focus_vob);
var C_NPC thiefcatcher;
[...]
if(pNpc.aivar[AIV_PlayerHasPickedMyPocket] == FALSE && !Npc_CanSeeNpc(pNpc,hero)&& hero.attribute[ATR_DEXTERITY] < pNpc.attribute[ATR_DEXTERITY] && pNpc.npcType != npctype_friend)
{
thiefcatcher = hlp_getnpc(pNpc);
hero_caughtstealing = true;
AI_TurnToNpc(pNpc,_hero);
//npc_clearaiqueue(pNpc);
b_resetthieflevel();
//b_clearperceptions(pNpc);
AI_StartState(pNpc,zs_observeplayer,1,"");
};
func int ZS_ObservePlayer_Loop()
{
if(hero_caughtstealing == TRUE)
{
b_assigncatchertalk(self);
};
[...]
};
func void b_assigncatchertalk(var C_Npc slf)
{
if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(thiefcatcher))
{
b_assigntalkgotyou(slf);
};
};
func void B_AssignTalkGotYou(var C_Npc slf)
{
dia_assigntalkgotyou.npc = Hlp_GetInstanceID(slf);
};
instance dia_assigntalkgotyou(c_info) {
nr = 1;
condition = dia_assigntalkgotyou_condition;
information = dia_assigntalkgotyou_info;
permanent = true;
important = true;
};
[...]
I put as condition the hero_caughtstealing variable.
func void Dual_Draw()
{
var C_ITEM MainHand; //added
if(ECX != _@(hero))
{
return;
};
if (oCNpc_GetSlotItem(hero, "ZS_RIGHTHAND")
&& !oCNpc_GetSlotItem(hero, Dual_SlotDraw))
{
var c_item it; it = _^(Ext_RemoveFromSlot(hero, Dual_SlotEquip));
Ext_PutInSlot(hero, it, Dual_SlotDraw);
MainHand = Npc_GetEquippedMeleeWeapon(hero); //added
MainHand.DamageTotal += it.DamageTotal; //added
Dual_SwimFix = _@(it);
};
};
func void Dual_UnDraw()
{
var C_ITEM MainHand; //added
if(ECX != _@(hero))
{
return;
};
if (oCNpc_GetSlotItem(hero, "ZS_SWORD")
&& !oCNpc_GetSlotItem(hero, Dual_SlotEquip))
{
var c_item it; it = _^(Ext_RemoveFromSlot(hero, Dual_SlotDraw));
Ext_PutInSlot(hero, it, Dual_SlotEquip);
MainHand = Npc_GetEquippedMeleeWeapon(hero); //added
MainHand.DamageTotal -= it.DamageTotal; //added
Dual_SwimFix = 0;
};
};
Kod: [Zaznacz]const int oCNpc_EVDrawWeapon2 = 7656832; //0x0074D580
Post połączony: 2017-09-02, 12:29
This script is big shit - i must rewrite because in old script i used 4 aivars for duals for only hero!.
MEM_ReadInt(ESP+324+4));
const int oCNpc__EV_DrawWeapon = 7654416; //0x74CC10 Hook: Shields
const int oCNpc__EV_DrawWeapon1 = 7656160; //0x74D2E0 Hook: Shields
Wczytałem jeszcze raz i tym razem poszło. Oczywiście że wgrywałem na czystego Gothica 2. W mody gram od bardzo wielu lat i nie przypominam sobie tak zbugowanej gry. Zobaczymy jak będzie dalej.
Can you share function?
//#################################################
//
// Nutzungshinweise:
//
//#################################################
/*************************************************
// Idee
//************************************************
Die hier vorgestellten Funktionen ermöglichen es,
für alle Npcs in der Welt oder alle Npcs in der KI-Glocke
eine beliebige Funktion aufzurufen.
//************************************************
// Setup
//************************************************
Eine aktuelle Version von Ikarus wird benötigt.
Ikarus gibt es hier:
http://forum.worldofplayers.de/forum/threads/969446-Skriptpaket-Ikarus-3
Die Datei, die du grade liest, ist nach Ikarus zu parsen.
//************************************************
// Funktionen
//************************************************
func void DoForAll (var func function)
func void DoForSphere (var func function)
"function" muss eine Funktion sein, die einen Parameter
vom Typ C_NPC nimmt und nichts zurückgibt.
DoForAll ruft function für jeden Npc auf, der in der Welt existiert.
DoForSphere ruft function für jeden Npc in der KI-Glocke auf
(also im Radius von ~40 Meter um die Kamera)
Beispiel:
**************************
func void foo() {
DoForSphere(SayHi);
};
func void SayHi(var C_NPC slf) {
PrintDebug(ConcatStrings (slf.name, " sagt Hallo!"));
};
**************************
Eine mögliche Anwendung für DoForAll wäre ein Schwierigkeitsgradsystem, dass,
wenn der Schwierigkeitsgrad verändert wird, alle Npcs anpassen muss.
######### Broadcasts #########
Eine einfache Abwandlung dieser Funktionen ist der Broadcast.
Die Idee ist hierbei, dass ein Npc, der "Caster", eine Nachricht
an alle anderen Npcs sendet, die dann bei jedem Npc verarbeitet wird.
Beispielsweise könnte ein Npc, der einen Massenheilzauber spricht,
dies "broadcasten" und die Npcs reagieren darauf, indem sie ihre Lebensenergie
auffüllen (wenn sie in der selben Partei kämpfen wie der Caster).
Grundsätzlich ergeben sich durch Broadcasts mannigfache Möglichkeiten für Flächenzauber.
Broadcasts können auch Wahrnehmungen sinnvoll ergänzen und helfen eine Situation zu überblicken.
Etwa könnte ein Monster, bevor es den Spieler angreift erstmal einen "durchzählen!"-Broadcast
herausschicken, indem sich alle Freunde des Monsters "melden". So könnte ein Wolf,
der alleine ist, fliehen (vielleicht sogar zu einem Rudel in der Nähe);
ein Wolf, der im Rudel steht dagegen mutiger sein.
Ein Troll, der den Spieler kommen sieht, könnte das allen Npcs mitteilen,
woraufhin vielleicht Goblins in der Umgebung bei ihm Schutz suchen.
Doch nun zur Funktion:
func void Broadcast (var C_NPC caster, var func function)
function muss eine Funktion sein, die zwei C_NPC Parameter entgegennimmt und nichts zurückgibt.
Dann wird function(npc, caster) für jeden Npc aufgerufen, der folgende Bedingungen erfüllt:
1.) Er ist in der KI-Glocke
2.) Er ist nicht tot (HP != 0).
Es gibt eine erweiterte ("EXtended") Version von Broadcast mit folgender Signatur:
func void BroadcastEx(var C_NPC caster, var func function,
var int excludeCaster, var int includeDead, var int includeShrinked)
Sind die drei zusätzlichen Parameter 0, so verhält sich BroadcastEx genau wie Broadcast.
Ansonsten beeinflussen die drei Parameter folgendes, wenn sie nicht Null sind:
excludeCaster: function wird nicht für den Caster aufgerufen
(das heißt der Caster benachrichtigt sich nicht selbst)
includeDead: Auch tote Npcs werden benachrichtigt (Bedingung 2. wird also ignoriert)
includeShrinked: Auch Npcs außerhalb der KI-Glocke (die daher nur in einer abgespeckten
Version in der Welt existieren (kein aktives Visual)) werden benachrichtigt.
(das heißt Bedingung 1. wird ignoriert).
Beispiel:
**************************
var int friendCount;
//Gibt Anzahl Freunde von slf zurück, die in der KI-Glocke sind.
func int CountFriends(var C_NPC slf) {
friendCount = 0;
Broadcast(slf, CountFrieds_Sub);
return friendCount;
};
//Hilfsfunktion:
func void CountFrieds_Sub(var C_NPC slf, var C_NPC caster) {
if (Npc_GetPermAttitude(slf, caster) == ATT_FRIENDLY) {
friendCount += 1;
};
};
**************************
Anmerkung: Schachteln der Funktionen ist nicht erlaubt.
Das heißt während eine Ausführung von DoForAll / DoForSphere läuft,
darf keine weitere gestartet werden.
*/
//#################################################
//
// Implementierung
//
//#################################################
//************************************************
// The Core: Iterating through Lists.
//************************************************
func void _BC_ForAll(var int funcID, var int sphereOnly) {
MEM_InitAll(); //safety, don't know if user did it.
var int busy;
if (busy) {
MEM_Error("Broadcast-System: Nesting is not allowed!");
return;
};
busy = true;
var C_NPC slfBak; slfBak = Hlp_GetNpc(self);
var C_NPC othBak; othBak = Hlp_GetNpc(other);
if (sphereOnly) {
/* to speed things up (and do the filtering)
* we only search the (small) active Vob List */
var int i; i = 0;
var int loop; loop = MEM_StackPos.position;
if (i < MEM_World.activeVobList_numInArray) {
var int vob;
vob = MEM_ReadIntArray(MEM_World.activeVobList_array, i);
if (Hlp_Is_oCNpc(vob)) {
var C_NPC npc;
npc = MEM_PtrToInst(vob);
MEM_PushInstParam(npc);
MEM_CallByID(funcID);
};
i += 1;
MEM_StackPos.position = loop;
};
} else {
/* walk through the entire Npc List (possibly large). */
var int listPtr; listPtr = MEM_World.voblist_npcs;
loop = MEM_StackPos.position;
if (listPtr) {
vob = MEM_ReadInt(listPtr + 4);
if (Hlp_Is_oCNpc(vob)) {
npc = MEM_PtrToInst(vob);
MEM_PushInstParam(npc);
MEM_CallByID(funcID);
};
listPtr = MEM_ReadInt(listPtr + 8);
MEM_StackPos.position = loop;
};
};
self = Hlp_GetNpc(slfbak);
other = Hlp_GetNpc(othbak);
busy = false;
};
func void DoForAll (var func _) {
var MEMINT_HelperClass symb;
var int theHandlerInt;
theHandlerInt = MEM_ReadInt(MEM_ReadIntArray(contentSymbolTableAddress, symb - 1) + zCParSymbol_content_offset);
_BC_ForAll(theHandlerInt, 0);
};
func void DoForSphere(var func _) {
var MEMINT_HelperClass symb;
var int theHandlerInt;
theHandlerInt = MEM_ReadInt(MEM_ReadIntArray(contentSymbolTableAddress, symb - 1) + zCParSymbol_content_offset);
_BC_ForAll(theHandlerInt, 1);
};
//************************************************
// Building on that: The Broadcast
//************************************************
var int _BC_funcID;
var int _BC_CasterPtr;
var C_NPC _BC_Caster;
var int _BC_ExcludeCaster;
var int _BC_SendToDead;
func void _BC_CallAssessFunc(var C_NPC slf) {
//ignore dead, unless they are explicitly included
if (!slf.attribute[ATR_HITPOINTS] && !_BC_SendToDead) {
return;
};
//ignore caster if this is wanted
if (_BC_ExcludeCaster) {
if (_BC_CasterPtr == MEM_InstToPtr(slf)) {
return;
};
};
MEM_PushInstParam(slf);
MEM_PushInstParam(_BC_Caster);
MEM_CallByID(_BC_funcID);
};
func void _BC_Broadcast(var C_NPC caster, var int funcID, var int excludeCaster, var int includeDead, var int includeShrinked) {
_BC_ExcludeCaster = excludeCaster;
_BC_Caster = Hlp_GetNpc(caster);
_BC_CasterPtr = MEM_InstToPtr(caster);
_BC_SendToDead = includeDead;
_BC_funcID = funcID;
if (includeShrinked) {
DoForAll(_BC_CallAssessFunc);
} else {
DoForSphere(_BC_CallAssessFunc);
};
};
func void Broadcast (var C_NPC caster, var func _) {
var MEMINT_HelperClass symb;
var int reactionFuncID;
reactionFuncID = MEM_ReadInt(MEM_ReadIntArray(contentSymbolTableAddress, symb - 1) + zCParSymbol_content_offset);
_BC_Broadcast(caster, reactionFuncID, 0, 0, 0);
};
func void BroadcastEx(var C_NPC caster, var func _, var int excludeCaster, var int includeDead, var int includeShrinked) {
var MEMINT_HelperClass symb;
var int reactionFuncID;
reactionFuncID = MEM_ReadInt(MEM_ReadIntArray(contentSymbolTableAddress, symb - 4) + zCParSymbol_content_offset);
_BC_Broadcast(caster, reactionFuncID, excludeCaster, includeDead, includeShrinked);
};
const int AIV_BROADCASTS_ANIM = 95;
func void BS_SaveAnim(var c_npc slf)
{
/*I tutaj dajemy warunki w zależności od ilości stylów. Ja dam tutaj jeden dla przykładu ;) */
if(slf.aivar[AIV_Broadcasts_Anim]==1)// arcymistrz
{
Mdl_RemoveOverlayMds(slf,"Humans_1hst2.mds"); //Wyłącz mu stary styl (ten bo ma >60% walki mieczem)
Mdl_RemoveOverlayMds(slf,"SHIELD_UNSKILLED.mds"); //Wyłącz mu obecny styl
Mdl_ApplyOverlayMds(slf,"SHIELD_UNSKILLED.mds");//I włącz go na nowo...
};
};
aivar[AIV_Broadcasts_Anim] = 1;
instance PAL_216_CEDRIC(NPC_DEFAULT)
{
name[0] = "Cedric";
guild = GIL_PAL;
id = 216;
voice = 12;
flags = 0;
npctype = NPCTYPE_MAIN;
b_setattributestochapter(self,6);
fight_tactic = FAI_HUMAN_MASTER;
aivar[AIV_NPCSHIELD] = TRUE;
EquipItem(self,itmw_1h_pal_sword);
EquipItem(self,itar_palshield2);
[color=red] aivar[AIV_Broadcasts_Anim] = 1;[/color]
b_createambientinv(self);
b_setnpcvisual(self,MALE,"Hum_Head_Fighter",FACE_N_NORMALBART10,BODYTEX_N,itar_pal_h);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");
Mdl_ApplyOverlayMds(self,"HUMANS_TALKGESTURES2.mds");
b_givenpctalents(self);
b_setfightskills(self,85);
daily_routine = rtn_start_216;
};
func void rtn_start_216()
{
ta_practice_sword(7,0,19,0,"NW_CITY_LHCASTLE_BASE_04");
ta_sleep(19,0,7,0,"NW_CITY_LEOMAR_BED_03");
};
func void init_global()
{
//Ikarus and LeGo startup
//things
DoForAll(BS_SaveAnim);
//other things
}
const int AIV_BROADCASTS_ANIM = 95;
http://forum.worldofplayers.de/forum/threads/775333-Script-Broadcasts?p=17232705&viewfull=1#post17232705
======================================= UNHANDLED EXCEPTION OCCURED ======================================================
======================================= CRASH INFOS: =====================================================================
Gothic II - 2.6 (fix), Parser Version: 50
User: KEKBUR, CPUType: 586, Mem: 0 MB total, 0 MB free
Startup Options:
=============================================== CALLSTACK : ==============================================================
0023:0079249D (0x00003FDB 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2877 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1405+40 byte(s)
0023:00792504 (0x00003FDB 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
0023:00792504 (0x0002052C 0x183B6414 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
0023:00792504 (0x000206E9 0x0000A4CC 0x0082E6F0 0x15C895E0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1415
0023:00792CBF (0x00AB40C0 0x0000A4CC 0x0135FA9C 0x0135FAA0) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1551
0023:006C20BF (0x0135FBD4 0x15C895E0 0x0135FBD0 0x0135FB00) Gothic2.exe, oCGame::CallScriptInit()+351 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 886
0023:006C9FE0 (0x0135FA9C 0x0135FB6C 0xFFFFFFFE 0x0135FB6C) Gothic2.exe, oCGame::LoadWorldStartup()+976 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 3150
0023:006C92DE (0xFFFFFFFE 0x0135FB00 0x18D5A26E 0x0135FCA0) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902
0023:006C6696 (0xFFFFFFFE 0x0135FBD0 0x0082E6F0 0x00000000) Gothic2.exe, oCGame::LoadGame()+246 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2147
0023:00429BF9 (0x00000015 0x00400000 0x01723F4C 0x0135FEC4) Gothic2.exe, CGameManager::Menu()+2345 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1474
0023:00425C35 (0x0082F0EC 0x00000001 0x001105DE 0x15C895E0) Gothic2.exe, CGameManager::Run()+1029 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 713
0023:0078188B (0x0000002C 0x00228ED9 0x00000016 0x00000000) Gothic2.exe, MainProg()+75 byte(s), P:\dev\g2addon\release\Gothic\_ulf\Phoenix.cpp, line 111
0023:00503270 (0x00400000 0x00000000 0x01723F4C 0x00000001) Gothic2.exe, HandledWinMain()+928 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1169
0023:00502DFD (0x0135FEC8 0x00000000 0x01723F4C 0x00000001) Gothic2.exe, WinMain()+141 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1054+17 byte(s)
0023:007D43F8 (0x00000004 0x0000FFFF 0x000000B8 0x00000000) Gothic2.exe, WinMainCRTStartup()+224 byte(s)
Spoko poradnik, tylko mogłeś napisać jak działa pakiet broadcast - wykonuję daną funkcje x razy (gdzie x to liczba wszystkich lub pobliskich npc, przyjmując jako argument kolejnych npc.
No i jeszcze tak się zastanawiam czy nie powinieneś wykorzystać DoForAll (Pewnie zadziała dużo wolniej), DoForSphere wykonuję funkcję tylko dla enpeców w odległości 40 metrów od kamery więc nie zawsze będzie działać.
func void lowmana()
{
var int manunterzo; manunterzo = hero.attribute[ATR_MANA_MAX]/3;
Npc_ChangeAttribute(hero,ATR_MANA,manunterzo/25);
};
func void useitpo_mana_01_advanced()
{
if(Npc_IsPlayer(self))
{
if(hero.attribute[ATR_MANA_MAX] <= 90)
{
Npc_ChangeAttribute(self,ATR_MANA,MANA_ESSENZ);
}
else if (hero.attribute[ATR_MANA_MAX] > 90 && !FF_ACTIVE(LowMana))
{
FF_ApplyOnceExt(LowMana,200,25);
};
}
else if(!Npc_IsPlayer(self))
{
Npc_ChangeAttribute(self,ATR_MANA,1500);
};
};
func void medmana()
{
var int manunmezzo; manunmezzo = hero.attribute[ATR_MANA_MAX]/2;
Npc_ChangeAttribute(hero,ATR_MANA,manunmezzo/25);
};
func void useitpo_mana_02_advanced()
{
if(Npc_IsPlayer(self))
{
if(hero.attribute[ATR_MANA_MAX] <= 140)
{
Npc_ChangeAttribute(self,ATR_MANA,70);
}
else if (hero.attribute[ATR_MANA_MAX] > 140 && !FF_ACTIVE(MedMana))
{
FF_ApplyOnceExt(MedMana,200,25);
};
}
else if(!Npc_IsPlayer(self))
{
Npc_ChangeAttribute(self,ATR_MANA,1500);
};
};
func void Higmana()
{
var int manun; manun = hero.attribute[ATR_MANA_MAX];
Npc_ChangeAttribute(hero,ATR_MANA,manun/25);
};
func void useitpo_mana_03_advanced()
{
if(Npc_IsPlayer(self))
{
if(!FF_ACTIVE(HigMana))
{
FF_ApplyOnceExt(HigMana,200,25);
};
}
else if(!Npc_IsPlayer(self))
{
Npc_ChangeAttribute(self,ATR_MANA,1500);
};
};
instance ITPO_MANA_01(C_ITEM)
{
name = NAME_TRANK;
mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;
value = VALUE_MANAESSENZ;
visual = "ITFO_POTION_MANA_01.3ds";
material = MAT_GLAS;
on_state[0] = useitpo_mana_01_advanced;
scemename = "POTIONFAST";
wear = WEAR_EFFECT;
////effect = "SPELLFX_MANAPOTION";
description = "Mana Essence";
text[1] = "Partially restores your mana";
text[2] = "Duration (seconds):";
count[2] = 5;
text[5] = NAME_VALUE;
count[5] = VALUE_MANAESSENZ;
};
instance ITPO_MANA_02(C_ITEM)
{
name = NAME_TRANK;
mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;
value = VALUE_MANAEXTRAKT;
visual = "ITFO_POTION_MANA_02.3ds";
material = MAT_GLAS;
on_state[0] = useitpo_mana_02_advanced;
scemename = "POTIONFAST";
wear = WEAR_EFFECT;
////effect = "SPELLFX_MANAPOTION";
description = "Mana Extract";
text[1] = "Partially restores your mana";
text[2] = "Duration (seconds):";
count[2] = 5;
text[5] = NAME_VALUE;
count[5] = VALUE_MANAEXTRAKT;
};
instance ITPO_MANA_03(C_ITEM)
{
name = NAME_TRANK;
mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;
value = VALUE_MANAELIXIER;
visual = "ITFO_POTION_MANA_03.3ds";
material = MAT_GLAS;
on_state[0] = useitpo_mana_03_advanced;
scemename = "POTIONFAST";
wear = WEAR_EFFECT;
//effect = "SPELLFX_MANAPOTION";
description = "Mana Elixir";
text[1] = "Completely restores your mana";
text[2] = "Duration (seconds):";
count[2] = 5;
text[5] = NAME_VALUE;
count[5] = VALUE_MANAELIXIER;
};
func void lowaccapi()
{
var int lifeunterzo; lifeunterzo = hero.attribute[ATR_HITPOINTS_MAX]/3;
Npc_ChangeAttribute(hero,ATR_HITPOINTS,lifeunterzo/25);
};
func void useitpo_health_01_advanced()
{
if(Npc_IsPlayer(self))
{
if(hero.attribute[ATR_HITPOINTS_MAX] <= 150)
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,50);
}
else if (hero.attribute[ATR_HITPOINTS_MAX] > 150 && !FF_ACTIVE(Lowaccapi))
{
FF_ApplyOnceExt(Lowaccapi,200,25);
};
}
else if(!Npc_IsPlayer(self))
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,50);
};
};
func void medaccapi()
{
var int lifeunmezzo; lifeunmezzo = hero.attribute[ATR_HITPOINTS_MAX]/2;
Npc_ChangeAttribute(hero,ATR_HITPOINTS,lifeunmezzo/25);
};
func void useitpo_health_02_advanced()
{
if(Npc_IsPlayer(self))
{
if(hero.attribute[ATR_HITPOINTS_MAX] <= 210)
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,70);
}
else if (hero.attribute[ATR_HITPOINTS_MAX] > 210 && !FF_ACTIVE(medaccapi))
{
FF_ApplyOnceExt(medaccapi,200,25);
};
}
else if(!Npc_IsPlayer(self))
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,70);
};
};
func void hiaccapi()
{
var int gharbl; gharbl = hero.attribute[ATR_HITPOINTS_MAX];
Npc_ChangeAttribute(hero,ATR_HITPOINTS,gharbl/25);
};
func void useitpo_health_03_advanced()
{
if(Npc_IsPlayer(self))
{
if(hero.attribute[ATR_HITPOINTS_MAX] <= 250)
{
Npc_ChangeAttribute(self,ATR_HITPOINTS, 120);
}
else if (hero.attribute[ATR_HITPOINTS_MAX] > 250 && !FF_ACTIVE(hiaccapi))
{
FF_ApplyOnceExt(hiaccapi,200,25);
};
}
else if(!Npc_IsPlayer(self))
{
Npc_ChangeAttribute(self,ATR_HITPOINTS,120);
};
};
instance ITPO_HEALTH_01(C_ITEM)
{
name = NAME_TRANK;
mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;
value = VALUE_HPESSENZ;
visual = "ITFO_POTION_HEALTH_01.3ds";
material = MAT_GLAS;
on_state[0] = useitpo_health_01_advanced;
scemename = "POTIONFAST";
wear = WEAR_EFFECT;
//effect = "SPELLFX_HEALTHPOTION";
description = "Essence of Healing";
text[1] = "Partially restores your life";
text[2] = "Duration (seconds):";
count[2] = 5;
text[5] = NAME_VALUE;
count[5] = VALUE_HPESSENZ;
};
instance ITPO_HEALTH_02(C_ITEM)
{
name = NAME_TRANK;
mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;
value = VALUE_HPEXTRAKT;
visual = "ITFO_POTION_HEALTH_02.3ds";
material = MAT_GLAS;
on_state[0] = useitpo_health_02_advanced;
scemename = "POTIONFAST";
wear = WEAR_EFFECT;
//effect = "SPELLFX_HEALTHPOTION";
description = "Extract of Healing";
text[1] = "Partially restores your life";
text[2] = "Duration (seconds):";
count[2] = 5;
text[5] = NAME_VALUE;
count[5] = VALUE_HPEXTRAKT;
};
instance ITPO_HEALTH_03(C_ITEM)
{
name = NAME_TRANK;
mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;
value = VALUE_HPELIXIER;
visual = "ITFO_POTION_HEALTH_03.3ds";
material = MAT_GLAS;
on_state[0] = useitpo_health_03_advanced;
scemename = "POTIONFAST";
wear = WEAR_EFFECT;
//effect = "SPELLFX_HEALTHPOTION";
description = "Elixir of Healing";
text[1] = "Completely restores your life";
text[2] = "Duration (seconds):";
count[2] = 5;
text[5] = NAME_VALUE;
count[5] = VALUE_HPELIXIER;
};
Also make sure, that every modifications of your model are made in EDIT MODE, because when exporting, blender will zero rotation and scale values that you apply in OBJECT MODE, i'm not sure what will happen with location though, but probably the same thing.
Try WinMerge - it will show you which scripts you have changed and what have you changed exactly in them. In can help more if you will have problems with using it.