N1kX
Модостроитель
- Регистрация
- 13 Ноя 2009
- Сообщения
- 6.124
- Благодарности
- 5.622
- Баллы
- 910
Как-то так. Нужно иметь установленный ikarus+LegoНе знаешь а икарус или лего могут это сделать?
SetBarPositions_Init с аргументами TRUE или FALSE нужно добавить в инициализацию Init_Global
SetBarPositions_Init(TRUE,TRUE)
1-й аргумент, показывать постоянно ману
2-й аргумент, показывать постоянно бар воздуха
Daedalus:
/*
* setBarPositions.d
* Source: https://forum.worldofplayers.de/forum/threads/?p=26426112
*
* Specify the positions of hp, mana, swim and focus bars.
*
* - Requires Ikarus, LeGo (HookEngine)
* - Compatible with Gothic 1 and Gothic 2
*
* Instructions
* - Adjust the customizable function to determine the bar positions
* - Initialize from Init_Global with
* SetBarPositions_Init(TRUE/FALSE, TRUE/FALSE);
* where the first and second arguments state whether the mana and swim bars should be always visible
*/
/*
* Customization function to specify the position of the bars in virtual coordinates
*/
func int SetBarPosition(var int barPtr) {
var oCViewStatusBar bar; bar = _^(barPtr);
var int x; var int y;
if (barPtr == MEM_Game.hpBar) {
// Original
x = Print_ToVirtual(10, PS_X); // 10 px from the left
y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y); // 10 px from the bottom
} else if (barPtr == MEM_Game.manaBar) {
// Original
x = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizex, PS_X); // 10 px from the right
y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y); // 10 px from the bottom
} else if (barPtr == MEM_Game.swimBar) {
// Original
x = (PS_VMax - bar.zCView_vsizex) / 2; // Centered
y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y); // 10 px from the bottom
} else if (barPtr == MEM_Game.focusBar) {
// Original
x = (PS_VMax - bar.zCView_vsizex) / 2; // Centered
y = Print_ToVirtual(10, PS_Y); // 10 px from the top
};
return x | (y << 14);
};
/*
* Internal function
*/
func void SetBarPositions() {
MEM_InitGlobalInst();
const int MASK_X = (PS_VMax << 1) - 1;
const int MASK_Y = ((PS_VMax << 1) - 1) << 14;
var int xy;
xy = SetBarPosition(MEM_Game.hpBar);
ViewPtr_MoveTo(MEM_Game.hpBar, (xy & MASK_X), (xy & MASK_Y) >> 14);
xy = SetBarPosition(MEM_Game.manaBar);
ViewPtr_MoveTo(MEM_Game.manaBar, (xy & MASK_X), (xy & MASK_Y) >> 14);
xy = SetBarPosition(MEM_Game.swimBar);
ViewPtr_MoveTo(MEM_Game.swimBar, (xy & MASK_X), (xy & MASK_Y) >> 14);
xy = SetBarPosition(MEM_Game.focusBar);
ViewPtr_MoveTo(MEM_Game.focusBar, (xy & MASK_X), (xy & MASK_Y) >> 14);
};
/*
* Initialization function
*/
func void SetBarPositions_Init(var int manaAlwaysOn, var int swimAlwaysOn) {
MEM_InitAll();
const int oCGame__UpdateScreenResolution_removeBarViews_G1 = 6524729; //0x638F39
const int oCGame__UpdateScreenResolution_removeBarViews_G2 = 7090409; //0x6C30E9
const int oCGame__UpdatePlayerStatus_manaBarJmp_G1 = 6525351; //0x6391A7
const int oCGame__UpdatePlayerStatus_manaBarJmp_G2 = 7091198; //0x6C33FE
const int oCGame__UpdatePlayerStatus_swimBarJmp_G1 = 6525142; //0x6390D6
const int oCGame__UpdatePlayerStatus_swimBarJmp_G2 = 7090988; //0x6C332C
var int addr;
// Hook positioning
HookEngineF(MEMINT_SwitchG1G2(oCGame__UpdateScreenResolution_removeBarViews_G1,
oCGame__UpdateScreenResolution_removeBarViews_G2), 6, SetBarPositions);
// Always show mana bar
if (manaAlwaysOn) {
addr = MEMINT_SwitchG1G2(oCGame__UpdatePlayerStatus_manaBarJmp_G1, oCGame__UpdatePlayerStatus_manaBarJmp_G2);
if (MEM_ReadInt(addr) != /*90 90 90 90*/-1869574000) {
MemoryProtectionOverride(addr, 1);
MEM_WriteByte(addr, 0);
};
};
// Always show swim bar
if (swimAlwaysOn) {
addr = MEMINT_SwitchG1G2(oCGame__UpdatePlayerStatus_swimBarJmp_G1, oCGame__UpdatePlayerStatus_swimBarJmp_G2);
MemoryProtectionOverride(addr, 2);
MEM_WriteByte(addr, /*EB*/235); // jmp
MEM_WriteByte(addr+1, /*1C*/ 28); // 0x28
};
};
Чтобы изменить положение баров, надо изменить их виртуальные координаты в функции SetBarPosition на эти
Daedalus:
if (barPtr == MEM_Game.hpBar) { //изменить положение бара здоровья
x = Print_ToVirtual(10, PS_X);
y = PS_VMax - Print_ToVirtual(6 + 3 * (4 + bar.zCView_psizey), PS_Y);
} else if (barPtr == MEM_Game.manaBar) { //изменить положение бара маны
x = Print_ToVirtual(10, PS_X);
y = PS_VMax - Print_ToVirtual(6 + 2 * (4 + bar.zCView_psizey), PS_Y);
} else if (barPtr == MEM_Game.swimBar) { //изменить положение бара воздуха
// Original
x = (PS_VMax - bar.zCView_vsizex) / 2; // Centered
y = PS_VMax - Print_ToVirtual(10 + bar.zCView_psizey, PS_Y); // 10 px from the bottom
Последнее редактирование: