I create nemesis plugin but not work [Help]

Coding Help/Re-API Supported
karan
Mod Tester
Mod Tester
India
Posts: 122
Joined: 6 years ago
Location: India
Contact:

#21

Post by karan » 4 years ago

jack now plugin is working but there are some problems; starting countdown is not working also round ambience is not working and when players is becoming nemesis his skin is not resetting(it stays nemesis skin even when he is zombie and also when he is human)
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#22

Post by Night Fury » 4 years ago

For the menu try:

Code: Select all

#include <zombie_escape>

native ze_is_user_nemesis(id)
native ze_set_user_nemesis(id, bool:set)

// Access to start nemesis menu
#define NEMESISMENU_ACCESS ADMIN_LEVEL_H
#define MENU_PAGE_PLAYERS g_menu_data[id]

const OFFSET_CSMENUCODE = 205

new g_menu_data[33]

public plugin_natives()
{
	register_native("ze_open_nemesis_menu", "native_ze_open_nemesis_menu", 1)
}

public plugin_init()
{
	register_plugin("[ZE] Nemesis Menu", "1.0", "Jack")
	register_concmd("ze_nemmenu", "cmd_nemmenu", NEMESISMENU_ACCESS)
}

public cmd_nemmenu(id, level, cid)
{
	if (!cmd_access(id, NEMESISMENU_ACCESS, cid, 0))
	{
		client_print(id, print_console, "You don't have access.")
		return PLUGIN_HANDLED
	}
	
	open_nemesis_menu(id)
	return PLUGIN_HANDLED
}

public open_nemesis_menu(id)
{
	static szMenu[250], szName[32]
	new iMenuID, index, buffer[2]

	iMenuID = menu_create("Make nemesis", "menu_player_list")

	for (index = 0; index <= get_member_game(m_nMaxPlayers); index++)
	{
		if (!is_user_alive(index))
			continue
		
		get_user_name(index, szName, charsmax(szName))
		formatex(szMenu, charsmax(szMenu), "%s \r[%s]", szName, ze_is_user_zombie(index) ? "Zombie" : "Human")

		buffer[0] = index
		buffer[1] = 0
		menu_additem(iMenuID, szMenu, buffer)
	}

	// Back - Next - Exit
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_BACK")
	menu_setprop(iMenuID, MPROP_BACKNAME, szMenu)
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_NEXT")
	menu_setprop(iMenuID, MPROP_NEXTNAME, szMenu)
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_EXIT")
	menu_setprop(iMenuID, MPROP_EXITNAME, szMenu)
	
	MENU_PAGE_PLAYERS = min(MENU_PAGE_PLAYERS, menu_pages(iMenuID) - 1)
	set_pdata_int(id, OFFSET_CSMENUCODE, 0)
	menu_display(id, iMenuID, MENU_PAGE_PLAYERS)
}

public menu_player_list(id, menuid, item)
{
	if (item == MENU_EXIT)
	{
		MENU_PAGE_PLAYERS = 0
		menu_destroy(menuid)
		open_nemesis_menu(id)
		return PLUGIN_HANDLED
	}
	
	// Remember player's menu page
	MENU_PAGE_PLAYERS = item / 7
	
	// Retrieve player id
	new buffer[2], dummy, player
	menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy)
	player = buffer[0]
	
	if (is_user_alive(player))
	{
		new szName[2][32]
		get_user_name(id, szName[0], charsmax(szName))
		get_user_name(player, szName[1], charsmax(szName))
		ze_set_user_nemesis(player, !ze_is_user_nemesis(player))
		ze_colored_print(0, "!tAdmin !g%s!n: !g%s !tturned into %s!n.", szName[0], szName[1], ze_is_user_nemesis(player) ? "zombie" : "nemesis")
	}
	else
		ze_colored_print(id, "Player isn't alive.")
	
	menu_destroy(menuid)
	open_nemesis_menu(id)
	return PLUGIN_HANDLED
}

public native_ze_open_nemesis_menu(id)
{
	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
		return -1
	}

	open_nemesis_menu(id)
	return true
}
What do you mean by external skin?
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

karan
Mod Tester
Mod Tester
India
Posts: 122
Joined: 6 years ago
Location: India
Contact:

#23

Post by karan » 4 years ago

Mohamed Alaa wrote: 4 years ago For the menu try:

Code: Select all

#include <zombie_escape>

native ze_is_user_nemesis(id)
native ze_set_user_nemesis(id, bool:set)

// Access to start nemesis menu
#define NEMESISMENU_ACCESS ADMIN_LEVEL_H
#define MENU_PAGE_PLAYERS g_menu_data[id]

const OFFSET_CSMENUCODE = 205

new g_menu_data[33]

public plugin_natives()
{
	register_native("ze_open_nemesis_menu", "native_ze_open_nemesis_menu", 1)
}

public plugin_init()
{
	register_plugin("[ZE] Nemesis Menu", "1.0", "Jack")
	register_concmd("ze_nemmenu", "cmd_nemmenu", NEMESISMENU_ACCESS)
}

public cmd_nemmenu(id, level, cid)
{
	if (!cmd_access(id, NEMESISMENU_ACCESS, cid, 0))
	{
		client_print(id, print_console, "You don't have access.")
		return PLUGIN_HANDLED
	}
	
	open_nemesis_menu(id)
	return PLUGIN_HANDLED
}

public open_nemesis_menu(id)
{
	static szMenu[250], szName[32]
	new iMenuID, index, buffer[2]

	iMenuID = menu_create("Make nemesis", "menu_player_list")

	for (index = 0; index <= get_member_game(m_nMaxPlayers); index++)
	{
		if (!is_user_alive(index))
			continue
		
		get_user_name(index, szName, charsmax(szName))
		formatex(szMenu, charsmax(szMenu), "%s \r[%s]", szName, ze_is_user_zombie(index) ? "Zombie" : "Human")

		buffer[0] = index
		buffer[1] = 0
		menu_additem(iMenuID, szMenu, buffer)
	}

	// Back - Next - Exit
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_BACK")
	menu_setprop(iMenuID, MPROP_BACKNAME, szMenu)
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_NEXT")
	menu_setprop(iMenuID, MPROP_NEXTNAME, szMenu)
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_EXIT")
	menu_setprop(iMenuID, MPROP_EXITNAME, szMenu)
	
	MENU_PAGE_PLAYERS = min(MENU_PAGE_PLAYERS, menu_pages(iMenuID) - 1)
	set_pdata_int(id, OFFSET_CSMENUCODE, 0)
	menu_display(id, iMenuID, MENU_PAGE_PLAYERS)
}

public menu_player_list(id, menuid, item)
{
	if (item == MENU_EXIT)
	{
		MENU_PAGE_PLAYERS = 0
		menu_destroy(menuid)
		open_nemesis_menu(id)
		return PLUGIN_HANDLED
	}
	
	// Remember player's menu page
	MENU_PAGE_PLAYERS = item / 7
	
	// Retrieve player id
	new buffer[2], dummy, player
	menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy)
	player = buffer[0]
	
	if (is_user_alive(player))
	{
		new szName[2][32]
		get_user_name(id, szName[0], charsmax(szName))
		get_user_name(player, szName[1], charsmax(szName))
		ze_set_user_nemesis(player, !ze_is_user_nemesis(player))
		ze_colored_print(0, "!tAdmin !g%s!n: !g%s !tturned into %s!n.", szName[0], szName[1], ze_is_user_nemesis(player) ? "zombie" : "nemesis")
	}
	else
		ze_colored_print(id, "Player isn't alive.")
	
	menu_destroy(menuid)
	open_nemesis_menu(id)
	return PLUGIN_HANDLED
}

public native_ze_open_nemesis_menu(id)
{
	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
		return -1
	}

	open_nemesis_menu(id)
	return true
}
What do you mean by external skin?
now frost nade is not working for nemesis; can u fix it plz
Image

User avatar
Mark
VIP
VIP
United States of America
Posts: 283
Joined: 5 years ago
Location: Des Moines/USA
Contact:

#24

Post by Mark » 4 years ago

Post your Frost Nade Code.

karan
Mod Tester
Mod Tester
India
Posts: 122
Joined: 6 years ago
Location: India
Contact:

#25

Post by karan » 4 years ago

  1. #include <zombie_escape>
  2.  
  3. // Setting File
  4. new const ZE_SETTING_RESOURCES[] = "zombie_escape.ini"
  5.  
  6. // Defines
  7. #define MODEL_MAX_LENGTH 64
  8. #define SOUND_MAX_LENGTH 64
  9. #define SPRITE_MAX_LENGTH 64
  10. #define TASK_FROST_REMOVE 200
  11. #define ID_FROST_REMOVE (taskid - TASK_FROST_REMOVE)
  12. #define TASK_FREEZE 2018
  13.  
  14. // Default Sounds
  15. new const szFrostGrenadeExplodeSound[][] =
  16. {
  17.     "warcraft3/frostnova.wav"
  18. }
  19.  
  20. new const szFrostGrenadePlayerSound[][] =
  21. {
  22.     "warcraft3/impalehit.wav"
  23. }
  24.  
  25. new const szFrostGrenadeBreakSound[][] =
  26. {
  27.     "warcraft3/impalelaunch1.wav"
  28. }
  29.  
  30. // Default Models
  31. new g_v_szFrostGrenadeModel[MODEL_MAX_LENGTH] = "models/zombie_escape/v_grenade_frost.mdl"
  32. new g_p_szFrostGrenadeModel[MODEL_MAX_LENGTH] = "models/zombie_escape/p_grenade_frost.mdl"
  33. new g_w_szFrostGrenadeModel[MODEL_MAX_LENGTH] = "models/zombie_escape/w_grenade_frost.mdl"
  34.  
  35. // Default Sprites
  36. new g_szGrenadeTrailSprite[SPRITE_MAX_LENGTH] = "sprites/laserbeam.spr"
  37. new g_szGrenadeRingSprite[SPRITE_MAX_LENGTH] = "sprites/shockwave.spr"
  38. new g_szGrenadeGlassSprite[SPRITE_MAX_LENGTH] = "models/glassgibs.mdl"
  39.  
  40. // Dynamic Arrays
  41. new Array:g_szFrostGrenadeExplodeSound
  42. new Array:g_szFrostGrenadePlayerSound
  43. new Array:g_szFrostGrenadeBreakSound
  44.  
  45. // Forwards
  46. enum _:TOTAL_FORWARDS
  47. {
  48.     FW_USER_FREEZE_PRE = 0,
  49.     FW_USER_UNFROZEN
  50. }
  51.  
  52. new g_iForwards[TOTAL_FORWARDS]
  53. new g_iForwardReturn
  54.  
  55. // Variables
  56. new bool:g_bIsFrozen[33],
  57.     bool:g_bZombieReleased,
  58.     g_iFrozenRenderingFx[33],
  59.     Float:g_fFrozenRenderingColor[33][3],
  60.     g_iFrozenRenderingRender[33],
  61.     Float:g_fFrozenRenderingAmount[33],
  62.     g_iMaxClients
  63.  
  64. // Sprites
  65. new g_iTrailSpr,
  66.     g_iExplodeSpr,
  67.     g_iGlassSpr
  68.  
  69. // Cvar
  70. new g_pCvarFrostDuration,
  71.     g_pCvarFrostHudIcon,
  72.     g_pCvarFrozenDamage,
  73.     g_pCvarFrostRadius,
  74.     g_pCvarHitType
  75.  
  76. public plugin_init()
  77. {
  78.     register_plugin("[ZE] Frost Nade", ZE_VERSION, AUTHORS)
  79.    
  80.     // Hook Chains
  81.     RegisterHookChain(RG_CBasePlayer_TraceAttack, "Fw_TraceAttack_Pre", 0)
  82.     RegisterHookChain(RG_CBasePlayer_Killed, "Fw_PlayerKilled_Post", 1)
  83.     RegisterHookChain(RG_CBasePlayer_PreThink, "Fw_PreThink_Post", 1)
  84.    
  85.     // Events
  86.     register_event("HLTV", "New_Round", "a", "1=0", "2=0")
  87.    
  88.     // Hams
  89.     RegisterHam(Ham_Think, "grenade", "Fw_ThinkGrenade_Post", 1)   
  90.    
  91.     // Fakemeta
  92.     register_forward(FM_SetModel, "Fw_SetModel_Post", 1)
  93.    
  94.     // Forwards
  95.     g_iForwards[FW_USER_FREEZE_PRE] = CreateMultiForward("ze_frost_pre", ET_CONTINUE, FP_CELL)
  96.     g_iForwards[FW_USER_UNFROZEN] = CreateMultiForward("ze_frost_unfreeze", ET_IGNORE, FP_CELL)
  97.    
  98.     // Cvars
  99.     g_pCvarFrostDuration = register_cvar("ze_frost_duration", "3")
  100.     g_pCvarFrostHudIcon = register_cvar("ze_frost_hud_icon", "1")
  101.     g_pCvarFrozenDamage = register_cvar("ze_freeze_damage", "0")
  102.     g_pCvarFrostRadius = register_cvar("ze_freeze_radius", "240.0")
  103.     g_pCvarHitType = register_cvar("ze_freeze_hit_type", "0")
  104.    
  105.     // Static Values
  106.     g_iMaxClients = get_member_game(m_nMaxPlayers)
  107. }
  108.  
  109. public plugin_natives()
  110. {
  111.     register_native("ze_zombie_in_forst", "native_ze_zombie_in_forst", 1)
  112.     register_native("ze_set_frost_grenade", "native_ze_set_frost_grenade", 1)
  113. }
  114.  
  115. public native_ze_zombie_in_forst(id)
  116. {
  117.     if (!is_user_alive(id))
  118.     {
  119.         return -1
  120.     }
  121.    
  122.     return g_bIsFrozen[id]
  123. }
  124.  
  125. public native_ze_set_frost_grenade(id, set)
  126. {
  127.     if (!is_user_alive(id))
  128.     {
  129.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
  130.         return -1;
  131.     }
  132.    
  133.     // Unfreeze
  134.     if (!set)
  135.     {
  136.         // Not frozen
  137.         if (!g_bIsFrozen[id])
  138.             return true
  139.        
  140.         // Remove freeze right away and stop the task
  141.         RemoveFreeze(id+TASK_FROST_REMOVE)
  142.         remove_task(id+TASK_FROST_REMOVE)
  143.         return true
  144.     }
  145.    
  146.     return set_freeze(id)
  147. }
  148.  
  149. public plugin_precache()
  150. {
  151.     // Initialize arrays
  152.     g_szFrostGrenadeExplodeSound = ArrayCreate(SOUND_MAX_LENGTH, 1)
  153.     g_szFrostGrenadePlayerSound = ArrayCreate(SOUND_MAX_LENGTH, 1)
  154.     g_szFrostGrenadeBreakSound = ArrayCreate(SOUND_MAX_LENGTH, 1)
  155.    
  156.     // Load from external file
  157.     amx_load_setting_string_arr(ZE_SETTING_RESOURCES, "Sounds", "FROST GRENADE EXPLODE", g_szFrostGrenadeExplodeSound)
  158.     amx_load_setting_string_arr(ZE_SETTING_RESOURCES, "Sounds", "FROST GRENADE PLAYER", g_szFrostGrenadePlayerSound)
  159.     amx_load_setting_string_arr(ZE_SETTING_RESOURCES, "Sounds", "FROST GRENADE BREAK", g_szFrostGrenadeBreakSound)
  160.    
  161.     // If we couldn't load custom sounds from file, use and save default ones
  162.    
  163.     new iIndex
  164.    
  165.     if (ArraySize(g_szFrostGrenadeExplodeSound) == 0)
  166.     {
  167.         for (iIndex = 0; iIndex < sizeof szFrostGrenadeExplodeSound; iIndex++)
  168.             ArrayPushString(g_szFrostGrenadeExplodeSound, szFrostGrenadeExplodeSound[iIndex])
  169.        
  170.         // Save to external file
  171.         amx_save_setting_string_arr(ZE_SETTING_RESOURCES, "Sounds", "FROST GRENADE EXPLODE", g_szFrostGrenadeExplodeSound)
  172.     }
  173.    
  174.     if (ArraySize(g_szFrostGrenadePlayerSound) == 0)
  175.     {
  176.         for (iIndex = 0; iIndex < sizeof szFrostGrenadePlayerSound; iIndex++)
  177.             ArrayPushString(g_szFrostGrenadePlayerSound, szFrostGrenadePlayerSound[iIndex])
  178.        
  179.         // Save to external file
  180.         amx_save_setting_string_arr(ZE_SETTING_RESOURCES, "Sounds", "FROST GRENADE PLAYER", g_szFrostGrenadePlayerSound)
  181.     }
  182.    
  183.     if (ArraySize(g_szFrostGrenadeBreakSound) == 0)
  184.     {
  185.         for (iIndex = 0; iIndex < sizeof szFrostGrenadeBreakSound; iIndex++)
  186.             ArrayPushString(g_szFrostGrenadeBreakSound, szFrostGrenadeBreakSound[iIndex])
  187.        
  188.         // Save to external file
  189.         amx_save_setting_string_arr(ZE_SETTING_RESOURCES, "Sounds", "FROST GRENADE BREAK", g_szFrostGrenadeBreakSound)
  190.     }
  191.    
  192.     // Load from external file, save if not found
  193.     if (!amx_load_setting_string(ZE_SETTING_RESOURCES, "Weapon Models", "V_GRENADE FROST", g_v_szFrostGrenadeModel, charsmax(g_v_szFrostGrenadeModel)))
  194.         amx_save_setting_string(ZE_SETTING_RESOURCES, "Weapon Models", "V_GRENADE FROST", g_v_szFrostGrenadeModel)
  195.     if (!amx_load_setting_string(ZE_SETTING_RESOURCES, "Weapon Models", "P_GRENADE FROST", g_p_szFrostGrenadeModel, charsmax(g_p_szFrostGrenadeModel)))
  196.         amx_save_setting_string(ZE_SETTING_RESOURCES, "Weapon Models", "P_GRENADE FROST", g_p_szFrostGrenadeModel)
  197.     if (!amx_load_setting_string(ZE_SETTING_RESOURCES, "Weapon Models", "W_GRENADE FROST", g_w_szFrostGrenadeModel, charsmax(g_w_szFrostGrenadeModel)))
  198.         amx_save_setting_string(ZE_SETTING_RESOURCES, "Weapon Models", "W_GRENADE FROST", g_w_szFrostGrenadeModel)
  199.     if (!amx_load_setting_string(ZE_SETTING_RESOURCES, "Grenade Sprites", "TRAIL", g_szGrenadeTrailSprite, charsmax(g_szGrenadeTrailSprite)))
  200.         amx_save_setting_string(ZE_SETTING_RESOURCES, "Grenade Sprites", "TRAIL", g_szGrenadeTrailSprite)
  201.     if (!amx_load_setting_string(ZE_SETTING_RESOURCES, "Grenade Sprites", "RING", g_szGrenadeRingSprite, charsmax(g_szGrenadeRingSprite)))
  202.         amx_save_setting_string(ZE_SETTING_RESOURCES, "Grenade Sprites", "RING", g_szGrenadeRingSprite)
  203.     if (!amx_load_setting_string(ZE_SETTING_RESOURCES, "Grenade Sprites", "GLASS", g_szGrenadeGlassSprite, charsmax(g_szGrenadeGlassSprite)))
  204.         amx_save_setting_string(ZE_SETTING_RESOURCES, "Grenade Sprites", "GLASS", g_szGrenadeGlassSprite)
  205.    
  206.     // Precache sounds
  207.    
  208.     new szSound[SOUND_MAX_LENGTH]
  209.    
  210.     for (iIndex = 0; iIndex < ArraySize(g_szFrostGrenadeExplodeSound); iIndex++)
  211.     {
  212.         ArrayGetString(g_szFrostGrenadeExplodeSound, iIndex, szSound, charsmax(szSound))
  213.         precache_sound(szSound)
  214.     }
  215.     for (iIndex = 0; iIndex < ArraySize(g_szFrostGrenadePlayerSound); iIndex++)
  216.     {
  217.         ArrayGetString(g_szFrostGrenadePlayerSound, iIndex, szSound, charsmax(szSound))
  218.         precache_sound(szSound)
  219.     }
  220.     for (iIndex = 0; iIndex < ArraySize(g_szFrostGrenadeBreakSound); iIndex++)
  221.     {
  222.         ArrayGetString(g_szFrostGrenadeBreakSound, iIndex, szSound, charsmax(szSound))
  223.         precache_sound(szSound)
  224.     }
  225.    
  226.     // Precache models
  227.     precache_model(g_v_szFrostGrenadeModel)
  228.     precache_model(g_p_szFrostGrenadeModel)
  229.     precache_model(g_w_szFrostGrenadeModel)
  230.    
  231.     // Precache sprites
  232.     g_iTrailSpr = precache_model(g_szGrenadeTrailSprite)
  233.     g_iExplodeSpr = precache_model(g_szGrenadeRingSprite)
  234.     g_iGlassSpr = precache_model(g_szGrenadeGlassSprite)
  235. }
  236.  
  237. public ze_user_humanized(id)
  238. {
  239.     // Set custom grenade model
  240.     cs_set_player_view_model(id, CSW_FLASHBANG, g_v_szFrostGrenadeModel)
  241.     cs_set_player_weap_model(id, CSW_FLASHBANG, g_p_szFrostGrenadeModel)
  242.     cs_set_player_view_model(id, CSW_SMOKEGRENADE, g_v_szFrostGrenadeModel)
  243.     cs_set_player_weap_model(id, CSW_SMOKEGRENADE, g_p_szFrostGrenadeModel)
  244.    
  245.     // If frozen, remove freeze after player is cured
  246.     if (g_bIsFrozen[id])
  247.     {
  248.         // Update rendering values first
  249.         ApplyFrozenRendering(id)
  250.        
  251.         // Remove freeze right away and stop the task
  252.         RemoveFreeze(id+TASK_FROST_REMOVE)
  253.         remove_task(id+TASK_FROST_REMOVE)
  254.     }
  255. }
  256.  
  257. public Fw_PreThink_Post(id)
  258. {
  259.     if (!ze_is_user_zombie(id))
  260.         return
  261.  
  262.     if (g_bIsFrozen[id] && g_bZombieReleased)
  263.     {
  264.         // Stop and Freeze Zombie
  265.         set_entvar(id, var_velocity, Float:{0.0,0.0,0.0})
  266.         set_entvar(id, var_maxspeed, 1.0)
  267.         ApplyFrozenRendering(id)
  268.     }
  269. }
  270.  
  271. public client_disconnected(id)
  272. {
  273.     g_bIsFrozen[id] = false
  274.     remove_task(id+TASK_FROST_REMOVE)
  275. }
  276.  
  277. public New_Round()
  278. {
  279.     remove_task(TASK_FREEZE)
  280.     g_bZombieReleased = false
  281.    
  282.     // Set w_ models for grenades on ground
  283.     new szModel[32], iEntity = -1;
  284.  
  285.     while((iEntity = rg_find_ent_by_class( iEntity, "armoury_entity")))
  286.     {
  287.         get_entvar(iEntity, var_model, szModel, charsmax(szModel))
  288.        
  289.         if (equali(szModel, "models/w_flashbang.mdl") || equali(szModel, "models/w_smokegrenade.mdl"))
  290.         {
  291.             engfunc(EngFunc_SetModel, iEntity, g_w_szFrostGrenadeModel)
  292.         }
  293.     }
  294. }
  295.  
  296. public Fw_TraceAttack_Pre(iVictim, iAttacker)
  297. {
  298.     // Block damage while frozen
  299.     if ((get_pcvar_num(g_pCvarFrozenDamage) == 0) && g_bIsFrozen[iVictim])
  300.         return HC_SUPERCEDE
  301.    
  302.     return HC_CONTINUE
  303. }
  304.  
  305. public Fw_PlayerKilled_Post(iVictim)
  306. {
  307.     // Frozen player being killed
  308.     if (g_bIsFrozen[iVictim])
  309.     {
  310.         // Remove freeze right away and stop the task
  311.         RemoveFreeze(iVictim+TASK_FROST_REMOVE)
  312.         remove_task(iVictim+TASK_FROST_REMOVE)
  313.     }
  314. }
  315.  
  316. public ze_zombie_release()
  317. {
  318.     g_bZombieReleased = true
  319. }
  320.  
  321. public Fw_SetModel_Post(entity, const model[])
  322. {
  323.     // We don't care
  324.     if (strlen(model) < 8)
  325.         return FMRES_IGNORED
  326.    
  327.     // Get damage time of grenade
  328.     static Float:dmgtime
  329.     get_entvar(entity, var_dmgtime, dmgtime)
  330.    
  331.     // Grenade not yet thrown
  332.     if (dmgtime == 0.0)
  333.         return FMRES_IGNORED
  334.    
  335.     // Grenade's owner is zombie?
  336.     if (ze_is_user_zombie(get_entvar(entity, var_owner)))
  337.         return FMRES_IGNORED
  338.  
  339.     // Flashbang or Smoke
  340.     if ((model[9] == 'f' && model[10] == 'l') || (model[9] == 's' && model[10] == 'm'))
  341.     {
  342.         // Give it a glow
  343.         Set_Rendering(entity, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 16);
  344.        
  345.         // And a colored trail
  346.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  347.         write_byte(TE_BEAMFOLLOW) // TE id
  348.         write_short(entity) // entity
  349.         write_short(g_iTrailSpr) // sprite
  350.         write_byte(10) // life
  351.         write_byte(10) // width
  352.         write_byte(0) // r
  353.         write_byte(100) // g
  354.         write_byte(200) // b
  355.         write_byte(200) // brightness
  356.         message_end()
  357.        
  358.         // Set grenade type on the thrown grenade entity
  359.         set_entvar(entity, var_flTimeStepSound, 3333.0)
  360.     }
  361.    
  362.     // Set w_ model
  363.     if (equali(model, "models/w_flashbang.mdl") || equali(model, "models/w_smokegrenade.mdl"))
  364.     {
  365.         engfunc(EngFunc_SetModel, entity, g_w_szFrostGrenadeModel)
  366.         return FMRES_SUPERCEDE
  367.     }
  368.    
  369.     return FMRES_IGNORED
  370. }
  371.  
  372. public Fw_ThinkGrenade_Post(entity)
  373. {
  374.     // Invalid entity
  375.     if (!pev_valid(entity))
  376.         return HAM_IGNORED
  377.    
  378.     // Get damage time of grenade
  379.     static Float:dmgtime
  380.     get_entvar(entity, var_dmgtime, dmgtime)
  381.    
  382.     // Check if it's time to go off
  383.     if (dmgtime > get_gametime())
  384.         return HAM_IGNORED
  385.    
  386.     // Check if it's one of our custom nades
  387.     switch (get_entvar(entity, var_flTimeStepSound))
  388.     {
  389.         case 3333.0: // Frost Grenade
  390.         {
  391.             frost_explode(entity)
  392.             return HAM_SUPERCEDE
  393.         }
  394.     }
  395.     return HAM_IGNORED
  396. }
  397.  
  398. // Frost Grenade Explosion
  399. frost_explode(ent)
  400. {
  401.     // Get origin
  402.     static Float:origin[3]
  403.     get_entvar(ent, var_origin, origin)
  404.    
  405.     // Make the explosion
  406.     create_blast3(origin)
  407.    
  408.     // Frost nade explode sound
  409.     static sound[SOUND_MAX_LENGTH]
  410.     ArrayGetString(g_szFrostGrenadeExplodeSound, random_num(0, ArraySize(g_szFrostGrenadeExplodeSound) - 1), sound, charsmax(sound))
  411.     emit_sound(ent, CHAN_WEAPON, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  412.    
  413.     // Collisions
  414.     if (!get_pcvar_num(g_pCvarHitType))
  415.     {
  416.         new victim = -1
  417.        
  418.         while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, origin, get_pcvar_float(g_pCvarFrostRadius))) != 0)
  419.         {
  420.             // Only effect alive zombies, If player not released yet don't freeze him
  421.             if (!is_user_alive(victim) || !ze_is_user_zombie(victim) || !g_bZombieReleased)
  422.                 continue
  423.            
  424.             set_freeze(victim)
  425.         }
  426.     }
  427.     else
  428.     {
  429.         new Float:flNadeOrigin[3], Float:flVictimOrigin[3], Float:flDistance, tr = create_tr2(), Float:flFraction
  430.         get_entvar(ent, var_origin, flNadeOrigin)
  431.        
  432.         for(new iVictim = 1; iVictim <= g_iMaxClients; iVictim++)
  433.         {
  434.             if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim) || !g_bZombieReleased)
  435.                 continue
  436.            
  437.             get_entvar(iVictim, var_origin, flVictimOrigin)
  438.            
  439.             // Get distance between nade and player
  440.             flDistance = vector_distance(flNadeOrigin, flVictimOrigin)
  441.            
  442.             if(flDistance > get_pcvar_float(g_pCvarFrostRadius))
  443.                 continue
  444.            
  445.             flNadeOrigin[2] += 2.0;
  446.             engfunc(EngFunc_TraceLine, flNadeOrigin, flVictimOrigin, DONT_IGNORE_MONSTERS, ent, tr);
  447.             flNadeOrigin[2] -= 2.0;
  448.            
  449.             get_tr2(tr, TR_flFraction, flFraction);
  450.            
  451.             if(flFraction != 1.0 && get_tr2(tr, TR_pHit) != iVictim)
  452.                 continue;
  453.            
  454.             set_freeze(iVictim)
  455.         }
  456.        
  457.         // Free the trace handler
  458.         free_tr2(tr);
  459.     }
  460.    
  461.     // Get rid of the grenade
  462.     engfunc(EngFunc_RemoveEntity, ent)
  463. }
  464.  
  465. set_freeze(victim)
  466. {
  467.     // Already frozen
  468.     if (g_bIsFrozen[victim])
  469.         return false
  470.    
  471.     // Allow other plugins to decide whether player should be frozen or not
  472.     ExecuteForward(g_iForwards[FW_USER_FREEZE_PRE], g_iForwardReturn, victim)
  473.    
  474.     if (g_iForwardReturn >= PLUGIN_HANDLED)
  475.     {
  476.         // Get player's origin
  477.         static origin2[3]
  478.         get_user_origin(victim, origin2)
  479.        
  480.         // Broken glass sound
  481.         static sound[SOUND_MAX_LENGTH]
  482.         ArrayGetString(g_szFrostGrenadeBreakSound, random_num(0, ArraySize(g_szFrostGrenadeBreakSound) - 1), sound, charsmax(sound))
  483.         emit_sound(victim, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  484.        
  485.         // Glass shatter
  486.         message_begin(MSG_PVS, SVC_TEMPENTITY, origin2)
  487.         write_byte(TE_BREAKMODEL) // TE id
  488.         write_coord(origin2[0]) // x
  489.         write_coord(origin2[1]) // y
  490.         write_coord(origin2[2]+24) // z
  491.         write_coord(16) // size x
  492.         write_coord(16) // size y
  493.         write_coord(16) // size z
  494.         write_coord(random_num(-50, 50)) // velocity x
  495.         write_coord(random_num(-50, 50)) // velocity y
  496.         write_coord(25) // velocity z
  497.         write_byte(10) // random velocity
  498.         write_short(g_iGlassSpr) // model
  499.         write_byte(10) // count
  500.         write_byte(25) // life
  501.         write_byte(0x01) // flags
  502.         message_end()
  503.        
  504.         return false
  505.     }
  506.    
  507.     // Freeze icon?
  508.     if (get_pcvar_num(g_pCvarFrostHudIcon))
  509.     {
  510.         message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, victim)
  511.         write_byte(0) // damage save
  512.         write_byte(0) // damage take
  513.         write_long(DMG_DROWN) // damage type - DMG_FREEZE
  514.         write_coord(0) // x
  515.         write_coord(0) // y
  516.         write_coord(0) // z
  517.         message_end()
  518.     }
  519.    
  520.     // Set frozen flag
  521.     g_bIsFrozen[victim] = true
  522.    
  523.     // Freeze sound
  524.     static sound[SOUND_MAX_LENGTH]
  525.     ArrayGetString(g_szFrostGrenadePlayerSound, random_num(0, ArraySize(g_szFrostGrenadePlayerSound) - 1), sound, charsmax(sound))
  526.     emit_sound(victim, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  527.    
  528.     // Add a blue tint to their screen
  529.     message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, victim)
  530.     write_short(0) // duration
  531.     write_short(0) // hold time
  532.     write_short(0x0004) // fade type
  533.     write_byte(0) // red
  534.     write_byte(50) // green
  535.     write_byte(200) // blue
  536.     write_byte(100) // alpha
  537.     message_end()
  538.    
  539.     // Update player entity rendering
  540.     ApplyFrozenRendering(victim)
  541.    
  542.     // Set a task to remove the freeze
  543.     set_task(get_pcvar_float(g_pCvarFrostDuration), "RemoveFreeze", victim+TASK_FROST_REMOVE)
  544.     return true
  545. }
  546.  
  547. ApplyFrozenRendering(id)
  548. {
  549.     // Get current rendering
  550.     new rendering_fx = get_entvar(id, var_renderfx)
  551.     new Float:rendering_color[3]
  552.     get_entvar(id, var_rendercolor, rendering_color)
  553.     new rendering_render = get_entvar(id, var_rendermode)
  554.     new Float:rendering_amount
  555.     get_entvar(id, var_renderamt, rendering_amount)
  556.    
  557.     // Already set, no worries...
  558.     if (rendering_fx == kRenderFxGlowShell && rendering_color[0] == 0.0 && rendering_color[1] == 100.0
  559.         && rendering_color[2] == 200.0 && rendering_render == kRenderNormal && rendering_amount == 25.0)
  560.         return
  561.    
  562.     // Save player's old rendering
  563.     g_iFrozenRenderingFx[id] = get_entvar(id, var_renderfx)
  564.     get_entvar(id, var_rendercolor, g_fFrozenRenderingColor[id])
  565.     g_iFrozenRenderingRender[id] = get_entvar(id, var_rendermode)
  566.     get_entvar(id, var_renderamt, g_fFrozenRenderingAmount[id])
  567.    
  568.     // Light blue glow while frozen
  569.     Set_Rendering(id, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
  570. }
  571.  
  572. // Remove freeze task
  573. public RemoveFreeze(taskid)
  574. {
  575.     // Remove frozen flag
  576.     g_bIsFrozen[ID_FROST_REMOVE] = false
  577.    
  578.     // Restore rendering
  579.     new iRed = floatround(g_fFrozenRenderingColor[ID_FROST_REMOVE][0]),
  580.     iGreen = floatround(g_fFrozenRenderingColor[ID_FROST_REMOVE][1]),
  581.     iBlue = floatround(g_fFrozenRenderingColor[ID_FROST_REMOVE][2])
  582.  
  583.     Set_Rendering(ID_FROST_REMOVE, g_iFrozenRenderingFx[ID_FROST_REMOVE], iRed, iGreen, iBlue, g_iFrozenRenderingRender[ID_FROST_REMOVE], floatround(g_fFrozenRenderingAmount[ID_FROST_REMOVE]))
  584.  
  585.     // Gradually remove screen's blue tint
  586.     message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, ID_FROST_REMOVE)
  587.     write_short((1<<12)) // duration
  588.     write_short(0) // hold time
  589.     write_short(0x0000) // fade type
  590.     write_byte(0) // red
  591.     write_byte(50) // green
  592.     write_byte(200) // blue
  593.     write_byte(100) // alpha
  594.     message_end()
  595.    
  596.     // Broken glass sound
  597.     static sound[SOUND_MAX_LENGTH]
  598.     ArrayGetString(g_szFrostGrenadeBreakSound, random_num(0, ArraySize(g_szFrostGrenadeBreakSound) - 1), sound, charsmax(sound))
  599.     emit_sound(ID_FROST_REMOVE, CHAN_BODY, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  600.    
  601.     // Get player's origin
  602.     static origin[3]
  603.     get_user_origin(ID_FROST_REMOVE, origin)
  604.    
  605.     // Glass shatter
  606.     message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
  607.     write_byte(TE_BREAKMODEL) // TE id
  608.     write_coord(origin[0]) // x
  609.     write_coord(origin[1]) // y
  610.     write_coord(origin[2]+24) // z
  611.     write_coord(16) // size x
  612.     write_coord(16) // size y
  613.     write_coord(16) // size z
  614.     write_coord(random_num(-50, 50)) // velocity x
  615.     write_coord(random_num(-50, 50)) // velocity y
  616.     write_coord(25) // velocity z
  617.     write_byte(10) // random velocity
  618.     write_short(g_iGlassSpr) // model
  619.     write_byte(10) // count
  620.     write_byte(25) // life
  621.     write_byte(BREAK_GLASS) // flags
  622.     message_end()
  623.    
  624.     ExecuteForward(g_iForwards[FW_USER_UNFROZEN], g_iForwardReturn, ID_FROST_REMOVE)
  625. }
  626.  
  627. // Frost Grenade: Freeze Blast
  628. create_blast3(const Float:originF[3])
  629. {
  630.     // Smallest ring
  631.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
  632.     write_byte(TE_BEAMCYLINDER) // TE id
  633.     engfunc(EngFunc_WriteCoord, originF[0]) // x
  634.     engfunc(EngFunc_WriteCoord, originF[1]) // y
  635.     engfunc(EngFunc_WriteCoord, originF[2]) // z
  636.     engfunc(EngFunc_WriteCoord, originF[0]) // x axis
  637.     engfunc(EngFunc_WriteCoord, originF[1]) // y axis
  638.     engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis
  639.     write_short(g_iExplodeSpr) // sprite
  640.     write_byte(0) // startframe
  641.     write_byte(0) // framerate
  642.     write_byte(4) // life
  643.     write_byte(60) // width
  644.     write_byte(0) // noise
  645.     write_byte(0) // red
  646.     write_byte(100) // green
  647.     write_byte(200) // blue
  648.     write_byte(200) // brightness
  649.     write_byte(0) // speed
  650.     message_end()
  651.    
  652.     // Medium ring
  653.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
  654.     write_byte(TE_BEAMCYLINDER) // TE id
  655.     engfunc(EngFunc_WriteCoord, originF[0]) // x
  656.     engfunc(EngFunc_WriteCoord, originF[1]) // y
  657.     engfunc(EngFunc_WriteCoord, originF[2]) // z
  658.     engfunc(EngFunc_WriteCoord, originF[0]) // x axis
  659.     engfunc(EngFunc_WriteCoord, originF[1]) // y axis
  660.     engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis
  661.     write_short(g_iExplodeSpr) // sprite
  662.     write_byte(0) // startframe
  663.     write_byte(0) // framerate
  664.     write_byte(4) // life
  665.     write_byte(60) // width
  666.     write_byte(0) // noise
  667.     write_byte(0) // red
  668.     write_byte(100) // green
  669.     write_byte(200) // blue
  670.     write_byte(200) // brightness
  671.     write_byte(0) // speed
  672.     message_end()
  673.    
  674.     // Largest ring
  675.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
  676.     write_byte(TE_BEAMCYLINDER) // TE id
  677.     engfunc(EngFunc_WriteCoord, originF[0]) // x
  678.     engfunc(EngFunc_WriteCoord, originF[1]) // y
  679.     engfunc(EngFunc_WriteCoord, originF[2]) // z
  680.     engfunc(EngFunc_WriteCoord, originF[0]) // x axis
  681.     engfunc(EngFunc_WriteCoord, originF[1]) // y axis
  682.     engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis
  683.     write_short(g_iExplodeSpr) // sprite
  684.     write_byte(0) // startframe
  685.     write_byte(0) // framerate
  686.     write_byte(4) // life
  687.     write_byte(60) // width
  688.     write_byte(0) // noise
  689.     write_byte(0) // red
  690.     write_byte(100) // green
  691.     write_byte(200) // blue
  692.     write_byte(200) // brightness
  693.     write_byte(0) // speed
  694.     message_end()
  695. }
Mark wrote: 4 years ago Post your Frost Nade Code.
Image

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#26

Post by Muhammet20 » 4 years ago

karan wrote: 4 years ago
Mohamed Alaa wrote: 4 years ago For the menu try:

Code: Select all

#include <zombie_escape>

native ze_is_user_nemesis(id)
native ze_set_user_nemesis(id, bool:set)

// Access to start nemesis menu
#define NEMESISMENU_ACCESS ADMIN_LEVEL_H
#define MENU_PAGE_PLAYERS g_menu_data[id]

const OFFSET_CSMENUCODE = 205

new g_menu_data[33]

public plugin_natives()
{
	register_native("ze_open_nemesis_menu", "native_ze_open_nemesis_menu", 1)
}

public plugin_init()
{
	register_plugin("[ZE] Nemesis Menu", "1.0", "Jack")
	register_concmd("ze_nemmenu", "cmd_nemmenu", NEMESISMENU_ACCESS)
}

public cmd_nemmenu(id, level, cid)
{
	if (!cmd_access(id, NEMESISMENU_ACCESS, cid, 0))
	{
		client_print(id, print_console, "You don't have access.")
		return PLUGIN_HANDLED
	}
	
	open_nemesis_menu(id)
	return PLUGIN_HANDLED
}

public open_nemesis_menu(id)
{
	static szMenu[250], szName[32]
	new iMenuID, index, buffer[2]

	iMenuID = menu_create("Make nemesis", "menu_player_list")

	for (index = 0; index <= get_member_game(m_nMaxPlayers); index++)
	{
		if (!is_user_alive(index))
			continue
		
		get_user_name(index, szName, charsmax(szName))
		formatex(szMenu, charsmax(szMenu), "%s \r[%s]", szName, ze_is_user_zombie(index) ? "Zombie" : "Human")

		buffer[0] = index
		buffer[1] = 0
		menu_additem(iMenuID, szMenu, buffer)
	}

	// Back - Next - Exit
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_BACK")
	menu_setprop(iMenuID, MPROP_BACKNAME, szMenu)
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_NEXT")
	menu_setprop(iMenuID, MPROP_NEXTNAME, szMenu)
	formatex(szMenu, charsmax(szMenu), "%L", id, "MENU_EXIT")
	menu_setprop(iMenuID, MPROP_EXITNAME, szMenu)
	
	MENU_PAGE_PLAYERS = min(MENU_PAGE_PLAYERS, menu_pages(iMenuID) - 1)
	set_pdata_int(id, OFFSET_CSMENUCODE, 0)
	menu_display(id, iMenuID, MENU_PAGE_PLAYERS)
}

public menu_player_list(id, menuid, item)
{
	if (item == MENU_EXIT)
	{
		MENU_PAGE_PLAYERS = 0
		menu_destroy(menuid)
		open_nemesis_menu(id)
		return PLUGIN_HANDLED
	}
	
	// Remember player's menu page
	MENU_PAGE_PLAYERS = item / 7
	
	// Retrieve player id
	new buffer[2], dummy, player
	menu_item_getinfo(menuid, item, dummy, buffer, charsmax(buffer), _, _, dummy)
	player = buffer[0]
	
	if (is_user_alive(player))
	{
		new szName[2][32]
		get_user_name(id, szName[0], charsmax(szName))
		get_user_name(player, szName[1], charsmax(szName))
		ze_set_user_nemesis(player, !ze_is_user_nemesis(player))
		ze_colored_print(0, "!tAdmin !g%s!n: !g%s !tturned into %s!n.", szName[0], szName[1], ze_is_user_nemesis(player) ? "zombie" : "nemesis")
	}
	else
		ze_colored_print(id, "Player isn't alive.")
	
	menu_destroy(menuid)
	open_nemesis_menu(id)
	return PLUGIN_HANDLED
}

public native_ze_open_nemesis_menu(id)
{
	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
		return -1
	}

	open_nemesis_menu(id)
	return true
}
What do you mean by external skin?
now frost nade is not working for nemesis; can u fix it plz
Set ze_nemesis_freeze to 1 and the nemesis will be frozen when they attacked with frost nade

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#27

Post by Muhammet20 » 4 years ago

Finally someone made/fixed that addon
Nice work and thanks bro @Mohamed

BandiT
Member
Member
Romania
Posts: 59
Joined: 4 years ago
Contact:

#28

Post by BandiT » 4 years ago

So it-s working now this nemesis plugin ?

karan
Mod Tester
Mod Tester
India
Posts: 122
Joined: 6 years ago
Location: India
Contact:

#29

Post by karan » 4 years ago

no round ambience + no countdown and major bug is core's rules means when players disconnect the server it spamming restart can anyone fix it?
Image

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#30

Post by Muhammet20 » 4 years ago

karan wrote: 4 years ago no round ambience + no countdown and major bug is core's rules means when players disconnect the server it spamming restart can anyone fix it?
Wow wait wait wait
WTF that so much
@Raheem + @Mohamed

We Need HELP here

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#31

Post by Night Fury » 4 years ago

Wait for the next version..
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#32

Post by Night Fury » 4 years ago

Updated:
1- Added ambience.
2- Bug fixes.
3- Added countdown.
4- Added "ze_nemesis" command to set a specific player a nemesis.

Code:

Code: Select all

#include <zombie_escape>

// Uncomment to use custom model for nemesis
// Note: This includes player model & claws
//#define USE_NEMESIS_MODEL

// Uncomment to use leap for nemesis
// Leap Code: https://escapers-zone.net/viewtopic.php?p=10582#p10582
//#define USE_NEMESIS_LEAP

#define TASK_MAKE_NEMESIS 4949849
#define TASK_AMBIENCESOUND 2020
#define TASK_REAMBIENCESOUND 5050

// Access to start nemesis round
#define STARTNEMESIS_ACCESS ADMIN_LEVEL_H

// Settings file
new const ZE_SETTING_FILE[] = "zombie_escape.ini"

#if defined USE_NEMESIS_MODEL
// Default models
new const g_szModels_Nemesis_Player[][] = { "ze_nemesis_host" }
new const g_szModels_Nemesis_Claws[][] = { "models/zombie_escape/v_knife_nemesis.mdl" }

new Array:g_aModels_Nemesis_Player,
	Array:g_aModels_Nemesis_Claws
#endif

#if defined USE_NEMESIS_LEAP
native ze_get_longjump(id)
native ze_remove_longjump(id)
#endif

enum _:Colors
{
	Red = 0,
	Green,
	Blue
}

new g_iAmbianceSoundDuration = 160	// Set ambience duration = highest sound duration
new const szAmbianceSound[][] = 
{
	"zombie_escape/ze_ambiance1.mp3"
}

new bool:g_bIsNemesis[33],
	bool:g_bIsNextRoundNemesis = false,
	g_iCountDown,
	Array:g_szAmbianceSound

new g_pCvarNemesisHP,
	g_pCvarNemesisGravity,
	g_pCvarNemesisSpeed,
	g_pCvarNemesisGlow,
	g_pCvarNemesisGlowColor[Colors],
	g_pCvarNemesisKB,
	g_pCvarNemesisDmg,
	g_pCvarNemesisFreeze,
	g_pCvarNemesisFire

public plugin_natives()
{
	register_native("ze_is_user_nemesis", "native_ze_is_user_nemesis", 1)
	register_native("ze_set_user_nemesis", "native_ze_set_user_nemesis", 1)
}

public plugin_precache()
{
	g_szAmbianceSound = ArrayCreate(64, 1)
	amx_load_setting_string_arr(ZE_SETTING_FILE, "Sounds", "Nemesis Round Ambiance", g_szAmbianceSound)

	new iIndex, szSound[64]
	if (ArraySize(g_szAmbianceSound) == 0)
	{
		for (iIndex = 0; iIndex < sizeof szAmbianceSound; iIndex++)
			ArrayPushString(g_szAmbianceSound, szAmbianceSound[iIndex])
		
		// Save to external file
		amx_save_setting_string_arr(ZE_SETTING_FILE, "Sounds", "Nemesis Round Ambiance", g_szAmbianceSound)
	}

	for (iIndex = 0; iIndex < ArraySize(g_szAmbianceSound); iIndex++)
	{
		ArrayGetString(g_szAmbianceSound, iIndex, szSound, charsmax(szSound))
		
		if (equal(szSound[strlen(szSound)-4], ".mp3"))
		{
			format(szSound, charsmax(szSound), "sound/%s", szSound)
			precache_generic(szSound)
		}
		else
		{
			precache_sound(szSound)
		}
	}

	#if defined USE_NEMESIS_MODEL
		// Initialize arrays
		g_aModels_Nemesis_Player = ArrayCreate(32, 1)
		g_aModels_Nemesis_Claws = ArrayCreate(64, 1)
		
		// Load from external file
		amx_load_setting_string_arr(ZE_SETTING_FILE, "Player Models", "NEMESIS MODEL", g_aModels_Nemesis_Player)
		amx_load_setting_string_arr(ZE_SETTING_FILE, "Weapon Models", "V_KNIFE NEMESIS", g_aModels_Nemesis_Claws)
		
		// If we couldn't load from file, use and save default ones
		if (ArraySize(g_aModels_Nemesis_Player) == 0)
		{
			for (iIndex = 0; iIndex < sizeof g_szModels_Nemesis_Player; iIndex++)
				ArrayPushString(g_aModels_Nemesis_Player, g_szModels_Nemesis_Player[iIndex])
			
			// Save to external file
			amx_save_setting_string_arr(ZE_SETTING_FILE, "Player Models", "NEMESIS", g_aModels_Nemesis_Player)
		}

		if (ArraySize(g_aModels_Nemesis_Claws) == 0)
		{
			for (iIndex = 0; iIndex < sizeof g_szModels_Nemesis_Claws; iIndex++)
				ArrayPushString(g_aModels_Nemesis_Claws, g_szModels_Nemesis_Claws[iIndex])
			
			// Save to external file
			amx_save_setting_string_arr(ZE_SETTING_FILE, "Weapon Models", "V_KNIFE NEMESIS", g_aModels_Nemesis_Claws)
		}
		
		// Precache models
		new player_model[32], model[64], model_path[128]

		for (iIndex = 0; iIndex < ArraySize(g_aModels_Nemesis_Player); iIndex++)
		{
			ArrayGetString(g_aModels_Nemesis_Player, iIndex, player_model, charsmax(player_model))
			formatex(model_path, charsmax(model_path), "models/player/%s/%s.mdl", player_model, player_model)
			precache_model(model_path)
			// Support modelT.mdl files
			formatex(model_path, charsmax(model_path), "models/player/%s/%sT.mdl", player_model, player_model)
			if (file_exists(model_path)) precache_model(model_path)
		}

		for (iIndex = 0; iIndex < ArraySize(g_aModels_Nemesis_Claws); iIndex++)
		{
			ArrayGetString(g_aModels_Nemesis_Claws, iIndex, model, charsmax(model))
			precache_model(model)
		}
	#endif
}

public plugin_init()
{
	register_plugin("[ZE] Addons: Nemesis", "2.0", "Jack")

	RegisterHam(Ham_TakeDamage, "player", "Fw_TakeDamage")

	register_clcmd("ze_start_nemesis_next", "cmd_start_nemesis", STARTNEMESIS_ACCESS)
	register_concmd("ze_nemesis", "cmd_nemsis", STARTNEMESIS_ACCESS)

	g_pCvarNemesisHP = register_cvar("ze_nemesis_hp", "20000")	// Nemesis health - Set 0 to use zombie HP
	g_pCvarNemesisGravity = register_cvar("ze_nemesis_gravity", "600")	// Nemesis gravity - Set 0 to use zombie gravity
	g_pCvarNemesisSpeed = register_cvar("ze_nemesis_speed", "300")	// Nemesis speed - Set 0 to use zombie speed
	g_pCvarNemesisGlow = register_cvar("ze_nemesis_glow", "1")	// Nemesis glow - 1 = enable | 0 = disable
	g_pCvarNemesisGlowColor[Red] = register_cvar("ze_nemesis_glow_r", "255")	// Nemesis glow color RED
	g_pCvarNemesisGlowColor[Green] = register_cvar("ze_nemesis_glow_g", "255")	// Nemesis glow color GREEN
	g_pCvarNemesisGlowColor[Blue] = register_cvar("ze_nemesis_glow_b", "255")	// Nemesis glow color BLUE
	g_pCvarNemesisKB = register_cvar("ze_nemesis_kb", "200.0")	// Nemesis knockback - Set 0 to use zombie knockback
	g_pCvarNemesisDmg = register_cvar("ze_nemesis_dmg", "200.0")	// Nemesis damage
	g_pCvarNemesisFreeze = register_cvar("ze_nemesis_freeze", "0")	// Nemesis get frozen? - 1 = doesn't get frozen | 0 = gets frozen
	g_pCvarNemesisFire = register_cvar("ze_nemesis_fire", "1")	// Nemesis set on fire? - 1 = doesn't set on fire | 0 = set on fire
}

public client_disconnected(id)
{
	if (g_bIsNemesis[id])
	{
		new szPlayerName[2][32], iNewNemId
		get_user_name(id, szPlayerName[0], charsmax(szPlayerName))
		iNewNemId = GetRandomNemesis()
		get_user_name(iNewNemId, szPlayerName[1], charsmax(szPlayerName))
		g_bIsNemesis[id] = false
		Set_Nemesis(iNewNemId)
		ze_colored_print(0, "!g%s !thas left !n& !g%s !thas become nemesis!n.", szPlayerName[0], szPlayerName[1])
	}
}

public client_putinserver(id)
{
	if (g_bIsNemesis[id])
		g_bIsNemesis[id] = false
}

public ze_user_infected_pre(iVictim, iAttacker)
{
	if (g_bIsNemesis[iAttacker] && !ze_is_user_zombie(iVictim))
	{
		SendDeathMsg(iAttacker, iVictim)
		return 1
	}

	return 0
}

public Fw_TakeDamage(iVictim, iInfector, iAttacker, Float:iDamage)
{
	if (iVictim == iAttacker || !is_user_alive(iAttacker))
		return HAM_IGNORED

	if (g_bIsNemesis[iAttacker] && !ze_is_user_zombie(iVictim) && iInfector == iAttacker)
	{
		SetHamParamFloat(4, iDamage * get_pcvar_float(g_pCvarNemesisDmg))
		return HAM_HANDLED
	}

	return HAM_IGNORED
}

public ze_fire_pre(id)
{
	if (g_bIsNemesis[id] && get_pcvar_num(g_pCvarNemesisFire))
		return PLUGIN_HANDLED
	return PLUGIN_CONTINUE
}

public ze_frost_pre(id)
{
	if (g_bIsNemesis[id] && get_pcvar_num(g_pCvarNemesisFreeze))
		return PLUGIN_HANDLED
	return PLUGIN_CONTINUE
}

public ze_user_humanized(id)
{
	UnSet_Nemesis(id)
}

public ze_roundend()
{
	remove_task(TASK_AMBIENCESOUND)
	remove_task(TASK_REAMBIENCESOUND)
	remove_task(TASK_MAKE_NEMESIS)
	
	for (new id = 0; id <= get_member_game(m_nMaxPlayers); id++)
	{
		if (is_user_alive(id) && g_bIsNemesis[id])
			UnSet_Nemesis(id)
	}
}

public ze_game_started_pre()
{
	if (get_playersnum())
	{
		if (g_bIsNextRoundNemesis)
		{
			g_bIsNextRoundNemesis = false
			g_iCountDown = 5
			set_task(1.0, "StartNemesis", TASK_MAKE_NEMESIS, _, _, "b")
			set_task(3.0, "AmbianceSound", TASK_AMBIENCESOUND)
			return PLUGIN_HANDLED
		}
	}
	else
	{
		g_bIsNextRoundNemesis = false
		ze_colored_print(0, "!gThe server doesn't have enough players to start nemesis round !n(!tat least 1!n)!n.")
	}

	return PLUGIN_CONTINUE
}

public AmbianceSound()
{
	// Stop All Sounds
	StopSound()
	
	// Play The Ambiance Sound For All Players
	new szSound[64]
	ArrayGetString(g_szAmbianceSound, random_num(0, ArraySize(g_szAmbianceSound) - 1), szSound, charsmax(szSound))
	
	for (new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
	{
		if (!is_user_connected(id))
			continue

		PlaySound(id, szSound)
	}

	// We should Set Task back again to replay (Repeated 5 times MAX)
	set_task(float(g_iAmbianceSoundDuration), "AmbianceSound", TASK_REAMBIENCESOUND, _, _, "a", 5)
}

public StartNemesis(taskid)
{
	if (!g_iCountDown)
	{
		Set_Nemesis(GetRandomNemesis())
		remove_task(taskid)
		return
	}

	set_hudmessage(random(256), random(256), random(256), -1.0, 0.21, 0, 0.8, 0.8)
	show_hudmessage(0, "Nemesis starts in %d second(s).", g_iCountDown--)
}

public cmd_start_nemesis(id, level, cid)
{
	if (!cmd_access(id, STARTNEMESIS_ACCESS, cid, 0))
	{
		client_print(id, print_console, "You have not access.")
		return PLUGIN_HANDLED
	}
	
	g_bIsNextRoundNemesis = true
	client_print(id, print_console, "Nemesis round will start next round.")
	return PLUGIN_HANDLED
}

public cmd_nemsis(id, level, cid)
{
	if (!cmd_access(id, STARTNEMESIS_ACCESS, cid, 0))
	{
		client_print(id, print_console, "You have not access.")
		return PLUGIN_HANDLED
	}
	
	// Retrieve arguments
	new arg[32], player
	read_argv(1, arg, charsmax(arg))
	player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
	
	// Invalid target
	if (!player || !is_user_alive(player))
	{
		ze_colored_print(id, "Invalid player.")
		return PLUGIN_HANDLED
	}
	
	// Target not allowed to be nemesis
	if (g_bIsNemesis[player])
	{
		new player_name[32]
		get_user_name(player, player_name, charsmax(player_name))
		client_print(id, print_console, "[ZE] %s is already nemesis.", player_name)
		return PLUGIN_HANDLED
	}
	
	Set_Nemesis(player)
	return PLUGIN_HANDLED
}

public Set_Nemesis(id)
{
	g_bIsNemesis[id] = true

	if (!ze_is_user_zombie(id))
		ze_set_user_zombie(id)

	#if defined USE_NEMESIS_LEAP
		ze_get_longjump(id)
	#endif

	#if defined USE_NEMESIS_MODEL
		new szPlayerModel[32], szModel[64]
		ArrayGetString(g_aModels_Nemesis_Player, random_num(0, ArraySize(g_aModels_Nemesis_Player) - 1), szPlayerModel, charsmax(szPlayerModel))
		cs_set_user_model(id, szPlayerModel)

		ArrayGetString(g_aModels_Nemesis_Claws, random_num(0, ArraySize(g_aModels_Nemesis_Claws) - 1), szModel, charsmax(szModel))
		cs_set_player_view_model(id, CSW_KNIFE, szModel)
	#endif
	
	if (get_pcvar_num(g_pCvarNemesisHP))
	{
		set_entvar(id, var_health, get_pcvar_float(g_pCvarNemesisHP))
	}

	if (get_pcvar_num(g_pCvarNemesisSpeed))
	{
		ze_set_zombie_speed(id, get_pcvar_num(g_pCvarNemesisSpeed))
	}

	if (get_pcvar_num(g_pCvarNemesisGravity))
	{
		ze_set_user_gravity(id, get_pcvar_num(g_pCvarNemesisGravity))
	}

	if (get_pcvar_num(g_pCvarNemesisKB))
	{
		ze_set_user_knockback(id, get_pcvar_float(g_pCvarNemesisKB))
	}

	if (get_pcvar_num(g_pCvarNemesisGlow))
	{
		Set_Rendering(id, kRenderFxNone, 255, 0, 0, kRenderNormal, 15)
	}

	new szName[32]
	get_user_name(id, szName, charsmax(szName))
	set_hudmessage(255, 0, 0, -1.0, 0.21, 0, 0.0, 5.0, 0.1, 1.5)
	show_hudmessage(id, "%s became Nemesis", szName)
	ze_colored_print(0, "!g%s !tbecame !gNemesis!n.", szName)
	ze_colored_print(id, "!gYou !tbecame !gNemesis!n.")
}

public UnSet_Nemesis(id)
{
	if (!g_bIsNemesis[id] || !is_user_alive(id))
		return

	g_bIsNemesis[id] = false

	#if defined USE_NEMESIS_LEAP
		ze_remove_longjump(id)
	#endif

	if (get_pcvar_num(g_pCvarNemesisSpeed))
	{
		ze_reset_zombie_speed(id)
	}

	if (get_pcvar_num(g_pCvarNemesisGravity))
	{
		ze_reset_user_gravity(id)
	}

	if (get_pcvar_num(g_pCvarNemesisKB))
	{
		ze_reset_user_knockback(id)
	}

	if (get_pcvar_num(g_pCvarNemesisGlow))
	{
		Set_Rendering(id)
	}
}

public GetRandomNemesis()
{
	if (get_playersnum())
	{
		new iPlayers[32], iSelected[33], iCount = 0, iTotalPlayers, id
		get_players(iPlayers, iTotalPlayers)

		for (new i = 0; i < iTotalPlayers; i++)
		{
			id = iPlayers[i]

			if (is_user_alive(id) && !g_bIsNemesis[id])
			{
				iSelected[iCount++] = id
			}
		}

		return iSelected[random(--iCount)]
	}

	return 0
}

public native_ze_is_user_nemesis(id)
{
	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
		return -1
	}

	return g_bIsNemesis[id]
}

public native_ze_set_user_nemesis(id, bool:set)
{
	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
		return false
	}

	if (set)
	{
		if (!g_bIsNemesis[id])
			Set_Nemesis(id)
	}
	else
	{
		if (g_bIsNemesis[id])
			UnSet_Nemesis(id)
	}

	return true
}
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

BandiT
Member
Member
Romania
Posts: 59
Joined: 4 years ago
Contact:

#33

Post by BandiT » 4 years ago

i try to compile but i got some errors :

//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// ze_nemesis.sma
//
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(377) : error 017: undefined symbol "ze_set_user_gravity"
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(382) : error 017: undefined symbol "ze_set_user_knockback"
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(416) : error 017: undefined symbol "ze_reset_user_gravity"
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(421) : error 017: undefined symbol "ze_reset_user_knockback"
//
// 4 Errors.
// Could not locate output file C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\compiled\ze_nemesis.amx (compile failed).
//
// Compilation Time: 3.08 sec
// ----------------------------------------

Press enter to exit ...

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#34

Post by czirimbolo » 4 years ago

BandiT wrote: 4 years ago i try to compile but i got some errors :

//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// ze_nemesis.sma
//
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(377) : error 017: undefined symbol "ze_set_user_gravity"
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(382) : error 017: undefined symbol "ze_set_user_knockback"
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(416) : error 017: undefined symbol "ze_reset_user_gravity"
// C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\ze_nemesis.sma(421) : error 017: undefined symbol "ze_reset_user_knockback"
//
// 4 Errors.
// Could not locate output file C:\Users\Owner\Desktop\Compiler v1.8.3\scripting\compiled\ze_nemesis.amx (compile failed).
//
// Compilation Time: 3.08 sec
// ----------------------------------------

Press enter to exit ...
Update your compiler ---> viewtopic.php?f=6&t=221
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#35

Post by czirimbolo » 4 years ago

anyway this plugin is totally fucked up. When you are Nemesis, you cant infect, you cant kill, counting is messed up. Many errors in logs

L 12/06/2019 - 18:10:02: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20191206.log")
L 12/06/2019 - 18:10:02: Function "cmd_nemsis" was not found
L 12/06/2019 - 18:10:02: [AMXX] Displaying debug trace (plugin "nemesis.amxx", version "2.0")
L 12/06/2019 - 18:10:02: [AMXX] Run time error 19: function not found
L 12/06/2019 - 18:10:02: [AMXX] [0] nemesis.sma::plugin_init (line 155)
L 12/06/2019 - 18:12:31: Invalid CVAR pointer
L 12/06/2019 - 18:12:31: [AMXX] Displaying debug trace (plugin "nemesis.amxx", version "2.0")
L 12/06/2019 - 18:12:31: [AMXX] Run time error 10: native error (native "get_pcvar_float")
L 12/06/2019 - 18:12:31: [AMXX] [0] nemesis.sma::Set_Nemesis (line 365)
L 12/06/2019 - 18:12:31: [AMXX] [1] nemesis.sma::GetRandomNemesis (line 447)
L 12/06/2019 - 18:12:31: [AMXX] [2] nemesis.sma::StartNemesis (line 290)
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#36

Post by Night Fury » 4 years ago

czirimbolo wrote: 4 years ago anyway this plugin is totally fucked up. When you are Nemesis, you cant infect, you cant kill, counting is messed up. Many errors in logs

L 12/06/2019 - 18:10:02: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20191206.log")
L 12/06/2019 - 18:10:02: Function "cmd_nemsis" was not found
L 12/06/2019 - 18:10:02: [AMXX] Displaying debug trace (plugin "nemesis.amxx", version "2.0")
L 12/06/2019 - 18:10:02: [AMXX] Run time error 19: function not found
L 12/06/2019 - 18:10:02: [AMXX] [0] nemesis.sma::plugin_init (line 155)
L 12/06/2019 - 18:12:31: Invalid CVAR pointer
L 12/06/2019 - 18:12:31: [AMXX] Displaying debug trace (plugin "nemesis.amxx", version "2.0")
L 12/06/2019 - 18:12:31: [AMXX] Run time error 10: native error (native "get_pcvar_float")
L 12/06/2019 - 18:12:31: [AMXX] [0] nemesis.sma::Set_Nemesis (line 365)
L 12/06/2019 - 18:12:31: [AMXX] [1] nemesis.sma::GetRandomNemesis (line 447)
L 12/06/2019 - 18:12:31: [AMXX] [2] nemesis.sma::StartNemesis (line 290)
I have updated the code.
viewtopic.php?p=10852#p10852
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

BandiT
Member
Member
Romania
Posts: 59
Joined: 4 years ago
Contact:

#37

Post by BandiT » 4 years ago

This plugin have some resources for sound sprites ?

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#38

Post by czirimbolo » 4 years ago

Mohamed Alaa wrote: 4 years ago
czirimbolo wrote: 4 years ago anyway this plugin is totally fucked up. When you are Nemesis, you cant infect, you cant kill, counting is messed up. Many errors in logs

L 12/06/2019 - 18:10:02: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20191206.log")
L 12/06/2019 - 18:10:02: Function "cmd_nemsis" was not found
L 12/06/2019 - 18:10:02: [AMXX] Displaying debug trace (plugin "nemesis.amxx", version "2.0")
L 12/06/2019 - 18:10:02: [AMXX] Run time error 19: function not found
L 12/06/2019 - 18:10:02: [AMXX] [0] nemesis.sma::plugin_init (line 155)
L 12/06/2019 - 18:12:31: Invalid CVAR pointer
L 12/06/2019 - 18:12:31: [AMXX] Displaying debug trace (plugin "nemesis.amxx", version "2.0")
L 12/06/2019 - 18:12:31: [AMXX] Run time error 10: native error (native "get_pcvar_float")
L 12/06/2019 - 18:12:31: [AMXX] [0] nemesis.sma::Set_Nemesis (line 365)
L 12/06/2019 - 18:12:31: [AMXX] [1] nemesis.sma::GetRandomNemesis (line 447)
L 12/06/2019 - 18:12:31: [AMXX] [2] nemesis.sma::StartNemesis (line 290)
I have updated the code.
viewtopic.php?p=10852#p10852
still I cant infect or kill when I am the Nemesis. Also speed does not work. I have always 250 speed, cvar does not change anything
Image

karan
Mod Tester
Mod Tester
India
Posts: 122
Joined: 6 years ago
Location: India
Contact:

#39

Post by karan » 4 years ago

just add this

Code: Select all

public ze_user_infected_pre(iVictim, iAttacker)
{
	if (g_bIsNemesis[iAttacker] && !ze_is_user_zombie(iVictim))
	{
		ExecuteHamB(Ham_Killed, iVictim, iAttacker, 100)
                return 1
	}

	return 0
}
and its done working for me
Image

karan
Mod Tester
Mod Tester
India
Posts: 122
Joined: 6 years ago
Location: India
Contact:

#40

Post by karan » 4 years ago

and also if u facing model bug add this

Code: Select all

    #if defined USE_NEMESIS_MODEL
        new szPlayerModel[32], szModel[64]
        ArrayGetString(g_aModels_Nemesis_Player, random_num(0, ArraySize(g_aModels_Nemesis_Player) - 1), szPlayerModel, charsmax(szPlayerModel))
        cs_reset_user_model(id)
    #endif
at public UnSet_Nemesis(id)

and done
Image

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 4 guests