Страница 1 от 1

Cshop: HeGranade Multiplier

Публикувано на: 04 Сеп 2018, 01:40
от Marinovv

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <engine>
#include <customshop>

additem ITEM_HEDAMAGE;

new bool:g_bHasItem[33];

#define PLUGINNAME	"He damage Multiplier"
#define VERSION		"1.2"
#define AUTHOR		"Nightscream"

#define MAX_CZ_LENGHT	32

//new g_iMsgScoreInfo, g_iMsgDeathMsg

public plugin_init() {
	register_plugin( PLUGINNAME, VERSION, AUTHOR )
        register_plugin("CSHOP: He Grenade Damage", VERSION, "OciXCrom");
	register_cvar( "amx_hemulti", "5.00" );
	register_event( "Damage", "hedmg", "be" );
	
	//g_iMsgScoreInfo = get_user_msgid( "ScoreInfo" )
	//g_iMsgDeathMsg = get_user_msgid( "DeathMsg" )
}

public plugin_precache()
	ITEM_HEDAMAGE = cshop_register_item("He Grenade Damage", "Zoom Weapons Plus", 1000);

public cshop_item_selected(id, iItem)
{
	if(iItem == ITEM_HEDAMAGE)
		g_bHasItem[id] = true;
}

ublic cshop_item_removed(id, iItem)
{
	if(iItem == ITEM_HEDAMAGE)
		g_bHasItem[id] = false;
}


public hedmg(id) 
{
	new victim_id = id; 
	if (g_bHasItem[id])
	if( !is_user_connected( victim_id ) ) return PLUGIN_CONTINUE
	new dmg_take = read_data( 2 );
	new dmgtype = read_data( 3 );
	new Float:multiplier = get_cvar_float( "amx_hemulti" );
	new Float:damage = dmg_take * multiplier;
	new health = get_user_health( victim_id );
	
	new iWeapID, attacker_id = get_user_attacker( victim_id, iWeapID );
	
	if( !is_user_connected( attacker_id ) || !is_user_alive( victim_id ) ) {
		return PLUGIN_HANDLED
	}
	
	if( iWeapID == CSW_HEGRENADE ) {
					
		if( floatround(damage) >= health ) {
			if( victim_id == attacker_id ) {
				return PLUGIN_CONTINUE
			}
			return PLUGIN_CONTINUE
		}else {
			if( victim_id == attacker_id ) return PLUGIN_CONTINUE
			
			fakedamage( victim_id, "weapon_grenade", damage, dmgtype );
		}
	}
	
	return PLUGIN_CONTINUE
}
	
Добре де все не успявам. Искам да разясните малко нещата с тази булева new bool:g_bHasItem

Засега фиксирах. Изпуснал съм една буква в кода. Проблемът е, че може би твърде го редактирах. За момента кодът се компилира успешно, но не работи със и без закупуването на итемът.

Cshop: HeGranade Multiplier

Публикувано на: 04 Сеп 2018, 15:31
от OciXCrom

Код за потвърждение: Избери целия код

if (g_bHasItem[id])
if( !is_user_connected( victim_id ) ) return PLUGIN_CONTINUE
Тук нямаш никакви скоби и не знам как точно кодът чете това. Обаче като цяло начинът за промяна на щетата е каетгорично зле. Добави #include <hamsandwich> в кода и промени register_event реда с този:

Код за потвърждение: Избери целия код

RegisterHam(Ham_TakeDamage, "player", "hedmg", 0)
И цялата hedmg функция замени я с тези два реда:

Код за потвърждение: Избери целия код

public hedmg(iVictim, iInflictor, iAttacker, Float:fDamage, iDamageBits)
{
    if(g_bHasItem[iAttacker] && iDamageBits & DMG_GRENADE) 
        SetHamParamFloat(4, fDamage * get_cvar_num("amx_hemulti"))
}
amxmisc, fun и engine не са нужни вече.

Когато регистрираш квар, ползвай get_pcvar_num вместо get_cvar_num - доста по-бързо е.

Cshop: HeGranade Multiplier

Публикувано на: 04 Сеп 2018, 21:13
от Marinovv
Функцията DMG_GRENADE не я разпознава и я отчита като невалидна при компилиране?

Готово. Компилирах го като махнах функцията DMG_GRENADE и си работи плъгинът сега перфектно. Много благодаря отново. Жал ми е, че е толкова лесно за пренаписване, а аз самия не знам как. :headbang: :lock:

Cshop: HeGranade Multiplier

Публикувано на: 04 Сеп 2018, 23:30
от TheRedShoko
DMG_GRENADE означава, че част от щетата е причинена от граната. Премахвайки го, ти променяш щетата на всякакъв вид атаки (изстрел, наръгване etc). Проблемът идва от това, че компилираш под 1.8.2, където DMG_GRENADE все още не е дефинирано. Добави #define DMG_GRENADE 1<<24 и няма да има проблеми.

Cshop: HeGranade Multiplier

Публикувано на: 04 Сеп 2018, 23:57
от Marinovv
Готово. Благодарности и на двамата за помощта. Може да заключвате.