Mod Отображение хп над головой

Автор темы #1
Дата рег
16 Фев 2014
Сообщения
22
Симпатии
4
1. Создаем новый скрипт и добавляем его в scripts.cfg

Скрипт
Код:
#include "_defines.fos"
#include "_client_defines.fos"
#include "_colors.fos"
import int GUI_GetActiveMainScreen() from "client_gui";
#define GUI_ONHEAD_NB_MOD 3 //Переключение модов
#define GUI_ONHEAD_EMPTY 0 //Ничего не показывает
#define GUI_ONHEAD_NAME 1 //Показывает имя
#define GUI_ONHEAD_DETAILS 2 //Показывает имя и здоровье
//Глобальная переменая для смены мода
uint  GUI_OnHead_Mod;
 
//Изначально ничего не отображаем
void Init_GUI_OnHead()
{
GUI_OnHead_Mod = GUI_ONHEAD_EMPTY;
}
void Draw_GUI_OnHead()
{
 
if( GUI_GetActiveMainScreen() != CLIENT_MAIN_SCREEN_GAME )
return;
 
CritterCl@ cr = GetChosen();
CritterCl@[] crs;
GetCritters( 0, FIND_ALL, crs );
switch(GUI_OnHead_Mod)
{
case GUI_ONHEAD_EMPTY: // Ничего не показывает (0)
__ShowPlayerNames = false;
break;
case GUI_ONHEAD_NAME: // Показывает только имя (1)
{
int color_b = 0;
int color_g = 0;
int color_r = 0;
int  hp_proc = 0;
string name;
string hp;
for(uint  i = 0, imax = crs.length(); i < imax; i ++)
{
color_g = (255*crs[i].Param[ST_CURRENT_HP])/crs[i].Param[ST_MAX_LIFE];
hp_proc = crs[ i ].Param[ ST_CURRENT_HP ] * 100 / crs[i].Param[ ST_MAX_LIFE ];
if(color_g < 0)
color_g = 0;
color_r = 255 - color_g;
if( crs[i].IsPlayer() )
{
name = "\n" +  "|" + ( cr.Param[ ST_TEAM_ID ] != crs[i].Param[ ST_TEAM_ID ] ? COLOR_RED : COLOR_GREEN ) + " " + crs[ i ].Name;
crs[i].ContourColor = ( cr.Param[ ST_TEAM_ID ] != crs[i].Param[ ST_TEAM_ID ] ? COLOR_CONTOUR_RED : COLOR_CONTOUR_GREEN ) ;
}
else name = " ";
if( crs[i].IsNpc() && crs[i].Param[ ST_CURRENT_HP ] > -19 )
{
if( cr.PerkBase[ 301 ] != 0 )
{
hp = "|" + COLOR_RGB(color_r, color_g, color_b) + " " + crs[i].Param[ ST_CURRENT_HP ] + "/" + crs[i].Param[ ST_MAX_LIFE ];
}
else if( hp_proc > 0 )
{
hp = "|" + COLOR_RGB( color_r, color_g, color_b ) + " " + hp_proc + "%";
}
else
{
hp = "|" + COLOR_RGB( color_r, color_g, color_b ) + " " + "«пм»";
   }
}
else hp = " ";
crs[i].NameOnHead = hp + name;
}
}
__ShowPlayerNames = true;
break;
case GUI_ONHEAD_DETAILS: // Показывает имя и здоровье (2)
{
int color_b = 0;
int color_g = 0;
int color_r = 0;
int  hp_proc = 0;
string name;
string hp;
for(uint  i = 0, imax = crs.length(); i < imax; i ++)
{
color_g = (255*crs[i].Param[ ST_CURRENT_HP ])/crs[i].Param[ ST_MAX_LIFE ];
hp_proc = crs[ i ].Param[ ST_CURRENT_HP ] * 100 / crs[i].Param[ ST_MAX_LIFE ];
if(color_g < 0)
color_g = 0;
color_r = 255 - color_g;
if( crs[i].IsPlayer() )
{
name = "\n" +  "|" + ( cr.Param[ ST_TEAM_ID ] != crs[i].Param[ ST_TEAM_ID ] ? COLOR_RED : COLOR_GREEN ) + " " + crs[ i ].Name;
crs[i].ContourColor = ( cr.Param[ ST_TEAM_ID ] != crs[i].Param[ ST_TEAM_ID ] ? COLOR_CONTOUR_RED : COLOR_CONTOUR_GREEN ) ;
}
else name = " ";
 
if( crs[ i ].Param[ ST_CURRENT_HP ] > -19 )
{
if( cr.PerkBase[ 301 ] != 0 )
{
hp = "|" + COLOR_RGB(color_r, color_g, color_b) + " " + crs[i].Param[ ST_CURRENT_HP ] + "/" + crs[i].Param[ ST_MAX_LIFE ];
}
else if( hp_proc > 0 )
{
hp = "|" + COLOR_RGB( color_r, color_g, color_b ) + " " + hp_proc + "%";
}
else
{
hp = "|" + COLOR_RGB( color_r, color_g, color_b ) + " " + "«пм»";
   }
}
else hp = " ";
crs[ i ].NameOnHead = hp + name;
}
}
 
break;
}
}
//Called when we push F6
void Change_GUI_OnHead()
{
GUI_OnHead_Mod = (GUI_OnHead_Mod + 1) % GUI_ONHEAD_NB_MOD;
}
//Called when we push F7
void ShowNPC_GUI_OnHead()
{
__ShowNpcNames =  !__ShowNpcNames;
}
2. В client_main.fos в начале среди импартов добавляем:
Код:
import void Init_GUI_OnHead() from "gui_client_onhead";	// хп
import void Draw_GUI_OnHead() from "gui_client_onhead";	// хп
import void Change_GUI_OnHead() from "gui_client_onhead";  // хп
import void ShowNPC_GUI_OnHead() from "gui_client_onhead"; // хп
3. В функцию bool start() в начале функции добавляем:
Код:
Init_GUI_OnHead();
4. В функцию void render_iface( uint layer )
в условие if( layer == 3 )
Код:
Draw_GUI_OnHead();
4.
В функцию bool key_down( uint8 key )
Код:
if( key == DIK_F6 )	 // Игрок
{
Change_GUI_OnHead();
return true;
}
if( key == DIK_F7 )	   // НПС
{
ShowNPC_GUI_OnHead();
return true;
}
Запускаем сервер и радуемся)
 
Дата рег
2 Апр 2011
Сообщения
239
Симпатии
57
Код:
void render_iface( uint layer )
{
	if( layer == 2 )
	{
		GUI_Render( true );
	}
	else if( layer == 3 )
	{
		Draw_GUI_OnHead();
		DrawChosenTabs();
		GUI_Render( false );
	}
	else if( layer == 100 && __GmapActive )
...
Всё просто же.
 
Дата рег
23 Май 2014
Сообщения
1
Симпатии
0
Народ, хелп. У меня в файлах игры нет scripts.cfg и client_main.fos. Скрытые файлы отображаю, все равно нет. Подскажите, что делать?
 
Дата рег
22 Мар 2014
Сообщения
166
Симпатии
17
Это на сервере изменяется, а не в клиенте)) Server\scripts\scripts.cfg
 
Дата рег
17 Сен 2014
Сообщения
133
Симпатии
18
Нет, все-таки непонятно:
п.4 - в исходнике нет условия if( layer == 3 ), и код из пояснения LoadRunner совсем по другому выглядит. (ревизия 459)
Вот там что:
Код:
void render_iface( uint layer )
{
	if( layer == 2 )
	{
		GUI_EngineCallback_Render( true );
		DrawChosenTabs();
		GUI_EngineCallback_Render( false );
 
		// Help info
		if( __HelpInfo )
		{
			// About
			string aboutText =
				"FOnline " + ( __Singleplayer ? "Singleplayer" : "" ) + "\n" +
				"by Gamers for Gamers\n" +
				"version " + CustomCall( "Version" ) + "\n" +
				"\n" +
				"Traffic, bytes:\n" +
				"Send: " + CustomCall( "BytesSend" ) + "\n" +
				"Receive: " + CustomCall( "BytesReceive" ) + "\n" +
				"Sum: " + ( CustomCall( "BytesSend" ).toInt() + CustomCall( "BytesReceive" ).toInt() ) + "\n" +
				"\n" +
				"FPS: " + __FPS + " (" + ( !__VSync ? "" + abs( __FixedFPS ) : "VSync" ) + ( !__VSync && __FixedFPS < 0 ? ", sleep" : "" ) + ")\n" +
				"Ping: " + __Ping + "\n" +
				"\n" +
				"Sound: " + __SoundVolume + "\n" +
				"Music: " + __MusicVolume + "\n";
			if( __DebugInfo )
			{
				aboutText += "\n" +
							 "Focused object: " + ( GUI_GetFocusedObject() !is null ? GUI_GetFocusedObject().Name : "None" ) + "\n" +
							 "Pressed object: " + ( GUI_GetPressedObject() !is null ? GUI_GetPressedObject().Name : "None" ) + "\n" +
							 "Hovered object: " + ( GUI_GetHoveredObject() !is null ? GUI_GetHoveredObject().Name : "None" );
			}
			DrawText( aboutText, 30, 30, __ScreenWidth, __ScreenHeight, COLOR_RGB( 187, 187, 187 ), FONT_BIG, 0 );
 
			// Help
			DrawText( MSG_GAME( STR_GAME_HELP ), 0, 0, __ScreenWidth, __ScreenHeight, COLOR_WHITE, FONT_DEFAULT, FT_CENTERX | FT_CENTERY );
		}
	}
	else if( layer == 100 && __GmapActive )
	{
		// Here you can draw on global map
 
		// bool  __GmapActive - активна ли глобальная карта и все ли следующие нижеприведенные переменные корректны;
		// bool  __GmapWait   - включен режим ожидания ответа о подтверждении энкаунтера;
		// float __GmapZoom   - текущий масштаб, не забывайте учитывать его при рисовании на карте;
		// int   __GmapOffsetX/Y   - смещение карты от нулевой координаты (верхний-левый угол);
		// int   __GmapGroupCurX/Y - координаты группы игрока;
		// int   __GmapGroupToX/Y  - координаты точки назначения;
		// float __GmapGroupSpeed  - текущая скорость передвижения.
		// Для примера, расчет текущего пикселя группы:
		// x = __GmapGroupX / __GmapZoom + __GmapOffsetX, y = __GmapGroupY / __GmapZoom + __GmapOffsetY.
	}
}

п.4(2) - "В функцию bool key_down( uint8 key )" - тоже нет такой функции.

Может просто уже не актуально?
 
Дата рег
7 Июн 2013
Сообщения
5
Симпатии
0
Немогу понять где объявляется переменная __ShowNpcNames ?

Некомпилируется скрип нормально =(

Подскажите где покопать...
 
Дата рег
5 Фев 2016
Сообщения
6
Симпатии
1
Если не включить отображение(имени,хп) у игрока, то у НПЦ показывает только имя.
Если включить отображение у игрока, то у НПЦ показывает только хп.
Что не так в этом скрипте?
 
Дата рег
22 Мар 2014
Сообщения
166
Симпатии
17
Переделай под себя. Я переделал многое и нормально работает. А так скрипт нормальный
 
Дата рег
18 Фев 2017
Сообщения
16
Симпатии
0
Если не включить отображение(имени,хп) у игрока, то у НПЦ показывает только имя.
Если включить отображение у игрока, то у НПЦ показывает только хп.
Что не так в этом скрипте?
Отключи, что тебя не нужно. Я на базе это скрипта сделал покраску имен для фракций.
 
Дата рег
29 Июн 2014
Сообщения
38
Симпатии
2
Немогу понять где объявляется переменная __ShowNpcNames ?

Некомпилируется скрип нормально =(

Подскажите где покопать...
Нужно компилировать с параметром -client, поскольку это клиентская штука. То есть, писать <...>\scripts\gui_client_onhead.fos -client

Чтобы всё нормально работало, нужно назвать файл скрипта gui_client_onhead.fos
Если дать другое имя, то в client_main.fos добавлять нужно так:
import void Init_GUI_OnHead() from "название скрипта без .fos"; // хп
import void Draw_GUI_OnHead() from "название скрипта без .fos"; // хп
import void Change_GUI_OnHead() from "название скрипта без .fos"; // хп
import void ShowNPC_GUI_OnHead() from "название скрипта без .fos"; // хп

В остальных местах тоже подправить, чтобы не были перепутаны названия.
 
Дата рег
2 Июл 2015
Сообщения
99
Симпатии
1
Если никаких действий не совершать клиент крашится через некоторое время, замечал
подобное на другом сервере, но там такое было при включеной "осведомленности" и так же, если в клиенте действий долго не происходит.

Application
Name FOnline
Version 0438
OS 6.1.7601 (Service Pack 1)
Timestamp 2017.08.14 05:17:22
Exception
Code EXCEPTION_ACCESS_VIOLATION
Address 0x6DCA1D05
Flags 0x0
Info Attempted to read to an 0x25302F44
Thread 'Main' (9368, current)
scripts.fonline_tla_client, Critter_IsOverweight + 37
Thread 'Unknown' (9756)
ntdll, ZwWaitForSingleObject + 21
kernel32, WaitForSingleObjectEx + 67
kernel32, WaitForSingleObject + 18
nvoglv32, DrvValidateVersion + 32991
nvoglv32, (function-name not available) + 0
nvoglv32, (function-name not available) + 0
nvoglv32, DrvValidateVersion + 37527
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (2944)
ntdll, ZwWaitForMultipleObjects + 21
kernel32, WaitForMultipleObjectsEx + 142
USER32, PeekMessageW + 688
USER32, MsgWaitForMultipleObjects + 31
nvoglv32, DrvValidateVersion + 12901
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (10436)
ntdll, ZwWaitForMultipleObjects + 21
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (7004)
ntdll, ZwWaitForMultipleObjects + 21
kernel32, WaitForMultipleObjectsEx + 142
kernel32, WaitForMultipleObjects + 24
dsound, (function-name not available) + 0
dsound, (function-name not available) + 0
dsound, (function-name not available) + 0
dsound, (function-name not available) + 0
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (10984)
ntdll, NtTraceControl + 18
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (816)
ntdll, NtWaitForWorkViaWorkerFactory + 18
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (10580)
ntdll, ZwWaitForMultipleObjects + 21
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (10624)
ntdll, NtWaitForWorkViaWorkerFactory + 18
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Thread 'Unknown' (10500)
ntdll, NtWaitForWorkViaWorkerFactory + 18
kernel32, BaseThreadInitThunk + 18
ntdll, RtlInitializeExceptionChain + 99
ntdll, RtlInitializeExceptionChain + 54
Loaded modules
G:\rev\rev\Client\FOnline.exe (00400000)
C:\Windows\SysWOW64\ntdll.dll (77770000)
C:\Windows\syswow64\kernel32.dll (76C30000)
C:\Windows\syswow64\KERNELBASE.dll (75380000)
C:\Windows\syswow64\USER32.dll (76E00000)
C:\Windows\syswow64\GDI32.dll (77020000)
C:\Windows\syswow64\LPK.dll (75720000)
C:\Windows\syswow64\USP10.dll (76D60000)
C:\Windows\syswow64\msvcrt.dll (751C0000)
C:\Windows\syswow64\ADVAPI32.dll (75A40000)
C:\Windows\SysWOW64\sechost.dll (76C00000)
C:\Windows\syswow64\RPCRT4.dll (75270000)
C:\Windows\syswow64\SspiCli.dll (75100000)
C:\Windows\syswow64\CRYPTBASE.dll (750F0000)
C:\Windows\syswow64\WS2_32.dll (770B0000)
C:\Windows\syswow64\NSI.dll (75790000)
C:\Windows\system32\OPENGL32.dll (69170000)
C:\Windows\system32\GLU32.dll (6F8C0000)
C:\Windows\system32\DDRAW.dll (68F00000)
C:\Windows\system32\DCIMAN32.dll (6F8B0000)
C:\Windows\syswow64\SETUPAPI.dll (771D0000)
C:\Windows\syswow64\CFGMGR32.dll (75A10000)
C:\Windows\syswow64\OLEAUT32.dll (75DC0000)
C:\Windows\syswow64\ole32.dll (755C0000)
C:\Windows\syswow64\DEVOBJ.dll (757B0000)
C:\Windows\system32\dwmapi.dll (71F70000)
C:\Windows\system32\IPHLPAPI.DLL (730D0000)
C:\Windows\system32\WINNSI.DLL (730C0000)
C:\Windows\system32\dbghelp.dll (6D0A0000)
C:\Windows\syswow64\PSAPI.DLL (76B70000)
C:\Windows\system32\WINMM.dll (73350000)
C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\COMCTL32.dll (71D40000)
C:\Windows\syswow64\SHELL32.dll (75E50000)
C:\Windows\syswow64\SHLWAPI.dll (75160000)
C:\Windows\system32\IMM32.DLL (75730000)
C:\Windows\syswow64\MSCTF.dll (75C60000)
C:\Windows\SysWOW64\guard32.dll (735F0000)
C:\Windows\system32\api-ms-win-core-synch-l1-2-0.DLL (735E0000)
C:\Windows\system32\version.dll (735D0000)
C:\Windows\system32\fltlib.dll (735C0000)
C:\Windows\system32\uxtheme.dll (71DD0000)
C:\Windows\system32\nvoglv32.DLL (5FF80000)
C:\Windows\system32\WTSAPI32.dll (73570000)
C:\Windows\syswow64\WINTRUST.dll (76AA0000)
C:\Windows\syswow64\CRYPT32.dll (76F00000)
C:\Windows\syswow64\MSASN1.dll (75DB0000)
C:\Windows\system32\ntmarta.dll (72EE0000)
C:\Windows\syswow64\WLDAP32.dll (770F0000)
C:\Windows\syswow64\CLBCatQ.DLL (76AE0000)
C:\Windows\system32\msimtf.dll (749F0000)
C:\Windows\system32\WINSTA.dll (74220000)
C:\Windows\system32\dhcpcsvc.DLL (730A0000)
C:\Windows\system32\dsound.dll (6DD00000)
C:\Windows\system32\POWRPROF.dll (73930000)
C:\Windows\system32\MMDevAPI.DLL (6D630000)
C:\Windows\system32\PROPSYS.dll (73E10000)
C:\Windows\system32\wdmaud.drv (683F0000)
C:\Windows\system32\ksuser.dll (74530000)
C:\Windows\system32\AVRT.dll (74540000)
C:\Windows\system32\AUDIOSES.DLL (6D5F0000)
C:\Windows\system32\msacm32.drv (6F040000)
C:\Windows\system32\MSACM32.dll (6F8F0000)
C:\Windows\system32\midimap.dll (6F910000)
C:\Windows\system32\NLAapi.dll (73FA0000)
C:\Windows\system32\napinsp.dll (6F6A0000)
C:\Windows\system32\pnrpnsp.dll (6F1E0000)
C:\Windows\System32\winrnr.dll (6F1D0000)
C:\Windows\system32\pcapwsp.dll (10000000)
C:\Windows\system32\PrxerNsp.dll (72F30000)
C:\Windows\System32\mswsock.dll (72FD0000)
C:\Windows\system32\DNSAPI.dll (73030000)
C:\Windows\System32\fwpuclnt.dll (73FC0000)
C:\Windows\system32\rasadhlp.dll (72ED0000)
C:\Windows\system32\PrxerDrv.dll (73010000)
C:\Windows\System32\wshtcpip.dll (72F50000)

И еще вопрос, где КОНКРЕТНО прописано отображение приходящих сообщении над лежащей на земле рации?
 
Дата рег
22 Мар 2014
Сообщения
166
Симпатии
17
Если никаких действий не совершать клиент крашится через некоторое время, замечал
подобное на другом сервере, но там такое было при включеной "осведомленности" и так же, если в клиенте действий долго не происходит.
Да. на 412 ревизии, при быстром обновлении такая же ситуация.
Пришлось сделать иначе(обновление при движении) - думал сначала будет плохо выглядеть, но уже так с 2014 года работает и нет проблем. В бою, даже не заметно

Я выключил радио в Client_main
Код:
bool map_message( string& message, uint16& hexX, uint16& hexY, uint& color, uint& delay )
{
// Detect radio
if( color == 0xFFFFFFFE )
{
message = ".." + message + "..";
return false;
}
 
return true;
}
 
Последнее редактирование:
Дата рег
2 Июл 2015
Сообщения
99
Симпатии
1
Да. на 412 ревизии, при быстром обновлении такая же ситуация.
Пришлось сделать иначе(обновление при движении) - думал сначала будет плохо выглядеть, но уже так с 2014 года работает и нет проблем. В бою, даже не заметно

Я выключил радио в Client_main
Код:
bool map_message( string& message, uint16& hexX, uint16& hexY, uint& color, uint& delay )
{
// Detect radio
if( color == 0xFFFFFFFE )
{
message = ".." + message + "..";
return false;
}
 
return true;
}
У меня сейчас по другому и вроде не вылетает, пока отказался от предложенного выше мода, но уточни где и как ты при движении сделал обновление?
может пригодится мне и тем кто будет ставить мод.

вот кстати:
screen_2017.08.21_05-44-52.jpg
screen_2017.08.21_05-45-17.jpg
screen_2017.08.21_05-45-30.jpg
screen_2017.08.21_05-57-07.jpg
 
Дата рег
22 Мар 2014
Сообщения
166
Симпатии
17
У меня сейчас по другому и вроде не вылетает, пока отказался от предложенного выше мода, но уточни где и как ты при движении сделал обновление?
может пригодится мне и тем кто будет ставить мод.
в animation2d_process, а также добавил его в горячие клавиши (когда лечится, тогда тоже обновляется)