Преработка на функция за взимане кръв

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от deadlylord » 05 Мар 2018, 02:38

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

public fw_TakeDamage(victim, inflictor, Float:damage, damagebits)
{
	if(!is_user_connected(inflictor)||get_user_weapon(inflictor) != CSDMWP || !g_weaponability[inflictor] || !bb_is_user_zombie(victim))
	return PLUGIN_CONTINUE

	new Float:distanceBetween, Float:dmgRadius = 300.0, sum = 0, damage
	new Float:targetOrigin[3], Float:playerOrigin[3], name[32]
	new CsTeams:idTeam = cs_get_user_team(inflictor)

	get_user_name(inflictor, name, 31)
	new players[32], playerCount, player
	get_players(players, playerCount, "ah")

	for ( new i = 0; i < playerCount; i++ ) 
	{
		player = players[i]
		pev(victim, pev_origin, targetOrigin)
		pev(player, pev_origin, playerOrigin)
		distanceBetween = vector_distance(targetOrigin, playerOrigin)

		if ( distanceBetween <= dmgRadius ) 
		{
			if ( idTeam != cs_get_user_team(player) ) 
			{
				if(distanceBetween > 200.0 )
					damage = 30;
					
				if(distanceBetween > 100.0 && distanceBetween < 199.0 )
					damage = 40;
					
				if(distanceBetween > 1.0 && distanceBetween < 99.0)
					damage = 50;
				
				fm_set_user_health(player, get_user_health(player) - damage)
				
				ColorChat(player, TEAM_COLOR, "%s^1 You have been damaged with^4 %i^3 health", PREFIX, damage);
							
				sum = sum + damage;
			}
		}
	}
	
	ColorChat(0, TEAM_COLOR, "%s^4 %s^1 bullet exploded ^1and made^4 %i^3 ^1damage.", PREFIX, name, sum);

	return PLUGIN_HANDLED
}

Как мога да си направя функцията да работи с ExecuteHamB, вместо fm_set_user_health и get_user_health ?
Последно промяна от OciXCrom на 05 Мар 2018, 15:00, променено общо 1 път.
Причина: Редактирано заглавие!

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Преработка на функция

Мнение от OciXCrom » 05 Мар 2018, 14:59

Цялата функция с hamsandwich ли е регистрирана? Ако е така, структурата ѝ не е правилна. inflictor не е attacker.

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

public fw_TakeDamage(victim, inflictor, Float:damage, damagebits)
=>

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

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
Иначе опитай така:

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

ExecuteHamB(Ham_TakeDamage, player, inflictor, attacker, damage, DMG_BLAST)

Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от deadlylord » 05 Мар 2018, 15:22

Бях написал същото преди да си пусна темата, за функцията изтрих допълнителния аргумент, тъй като двата вършеха еднакавка роля, но няма значение промених 2те неща, който си написал и получавам същата краш грешка, когато се активира https://i.imgur.com/71eHxmT.png

Докато го правих само за 1 човек(victim), играта не крашваше, но ефекта се пускаше, докато victim не умре, което лесно го оправих с нова променлива count + проверка, но когато добавих цикъла за хората, започна да крашва с грешката от по-горе

Да няма някакъв проблем с регистирането на функцията?
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage", 1)
Последно промяна от deadlylord на 05 Мар 2018, 15:35, променено общо 1 път.

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от OciXCrom » 05 Мар 2018, 15:34

Ъъъ... Как така си премахнал аргумента? Като си направил това, си изместил всички други аргументи. Няма как просто да премахнеш един аргумент когато се намира преди другите, които ползваш. По този начин си направил damage да е attacker, а dmgbits да е damage. Редът на аргументите е от огромно значение.

Мислиш ли, че ако двата вършеха еднаква роля, щеше да ги има? Inflictor е еднакво с attacker, освен когато щетата е направена с HE граната, където inflictor става id-то на въпросната граната.

Върни inflictor където му е мястото и ползвай attacker.

Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от deadlylord » 05 Мар 2018, 15:40

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

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker)||get_user_weapon(attacker) != CSDMWP || !g_weaponability[attacker] || !bb_is_user_zombie(victim))
	return PLUGIN_CONTINUE

	new Float:distanceBetween, Float:dmgRadius = 300.0, sum = 0, damage
	new Float:targetOrigin[3], Float:playerOrigin[3], name[32]
	new CsTeams:idTeam = cs_get_user_team(attacker)

	get_user_name(attacker, name, 31)
	new players[32], playerCount, player
	get_players(players, playerCount, "ah")

	for ( new i = 0; i < playerCount; i++ ) 
	{
		player = players[i]
		pev(victim, pev_origin, targetOrigin)
		pev(player, pev_origin, playerOrigin)
		distanceBetween = vector_distance(targetOrigin, playerOrigin)

		if ( distanceBetween <= dmgRadius ) 
		{
			if ( idTeam != cs_get_user_team(player) ) 
			{
				if(distanceBetween > 200.0 )
					damage = 30;
					
				if(distanceBetween > 100.0 && distanceBetween < 199.0 )
					damage = 40;
					
				if(distanceBetween > 1.0 && distanceBetween < 99.0)
					damage = 50;
				
				ExecuteHamB(Ham_TakeDamage, player, inflictor, attacker, damage, DMG_BLAST)
				
				ColorChat(player, TEAM_COLOR, "%s^1 You have been damaged with^4 %i^3 health", PREFIX, damage);
							
				sum = sum + damage;
			}
		}
	}
	
	ColorChat(0, TEAM_COLOR, "%s^4 %s^1 bullet exploded ^1and made^4 %i^3 ^1damage.", PREFIX, name, sum);

	return PLUGIN_HANDLED
}

Готово смених ги, същата работа е https://imgur.com/a/YxMht

Когато си коментирам реда с ExecuteHamB математика си работи https://i.imgur.com/zeHAk3P.png ... когато използвам set и get нямам проблеми, но с ExecuteHamB играта крашва

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от OciXCrom » 05 Мар 2018, 15:50

Обаче защо ти трябва ExecuteHamB точно тук? Вече се намираш в Ham_TakeDamage функцията, вероятно и затова крашва. Направо ползвай SetHamParamFloat(4, damage) - по този начин директно ще промениш щетата.

Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от deadlylord » 05 Мар 2018, 16:13

SetHamParamFloat(4, damage) съм го използвал и го направих, но това променя само щетата на оръжието, а аз искам когато се активира ефекта да удари хората около човека, който стрелям ... тоест все едно се пуска he граната под човека, който стреляш и удря всички в Х радиус

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от OciXCrom » 05 Мар 2018, 16:22

Мда, не се загледах. Тогава какъв е проблемът да позлваш set/get_user_health?

Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Преработка на функция за взимане кръв

Мнение от deadlylord » 05 Мар 2018, 16:29

Когато убиеш някой човек със set_user_health горе излизат кости и не ти дава реални фрагове(дори и да използваш get и set user frags) ... точно за това искам да е с hamb, тъй като той прави "реална" щета и ако убиеш някой горе излиза иконата на оръжието и получаваш реалния фраг, също така направената щета излиза в плъгини от сорта на bulletdamage ...но като гледам тази функция не иска да работи с hamb...

Ако ти се занимава и е по-лесно, би ли направил нов плъгин, който, при стрелбва да имаш х% шанс да spawne he граната, където е target и тя да гръмне(и естествено да мога да и редактирам щетата и обхвата, ако е възможно), с това ще се избегнат тъпите сметки, който съм правил и най-вече проблема с киловете!

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Преработка на функция за взимане кръв

Мнение от TheRedShoko » 06 Мар 2018, 02:40

Пробвай да подадеш dmgbits, а не DMG_BLAST.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта