Ошибка: повторное срабатывание функции Javascript

  • Автор темы Автор темы Primo
  • Дата начала Дата начала

Primo

Пользователь
26 Авг 2016
65
0
В общем, есть кнопка, функция, которая вызывается по нажатию и эвент.
Код:
		<Button class="unit" id="unit_dragon_knight" onactivate="cmdBuyUnit('basic_unit_melee_1', 1)">
			<DOTAHeroImage heroname="npc_dota_hero_dragon_knight" /> 
		</Button>
Код:
function cmdBuyUnit(unitname, count)
{
	$.Msg( "EVENT: unit_buy - true ");
	if(Players.GetGold(Players.GetLocalPlayer()) >= unitCost[unitname])
	{
		
		var data = {
			name: unitname,
			count: count
		};
		GameEvents.SendCustomGameEventToServer( "buy_unit", data );
	}
}
Код:
function GameMode:OnBuyUnit(event)
	
	local hero = PlayerResource:GetSelectedHeroEntity(event.PlayerID)
	for a, unit in pairs(hero.unitlist) do 
		if unit.name == event.name then
			unit.count = unit.count + event.count
			break
		end
	end
	
	DeepPrintTable(event)
	GameRules:SendCustomMessage("<font color='#58ACFA'>Игрок купил юнит " .. event.name .. " !</font>", 0, 0)
end
Код:
function GameMode:OnHeroInGame(hero)
	CustomGameEventManager:RegisterListener( "buy_unit", Dynamic_Wrap(GameMode, "OnBuyUnit") )
end
Когда в игре присутствует один герой, то количество покупаемых героев равно одному, а когда 2, то количество равно двум. И так далее по нарастающей.
Понял это по тому, что когда создаю в игре героя (-createhero axe enemy), и последующем нажатии на кнопку, дублируется надпись "Игрок купил юнит " .. event.name .. " !", ну и, соответственно, появляется 2 юнита, вместо одного.
Логично, что если я создам еще 2 героя (то бишь их будет 4 в сумме), то надпись продублируется 4 раза, и создастся 4 юнита.
Предполагаю, что это может быть из-за того, что регистрирую слушателя в GameMode:OnHeroInGame.

Чего я хочу добиться. Я хочу, чтобы не было зависимости кол-во геров <-> кол-во юнитов.
 
Последнее редактирование модератором:
Re: Повторное срабатывание функции Javascript

Ну так регистрируй 1 раз, а не каждый раз когда герой появляется в игре.
 
Re: Повторное срабатывание функции Javascript

Я хочу, чтобы не было зависимости кол-во геров <-> кол-во юнитов.

Зависимости которую ты сам и добавил.
 
Последнее редактирование модератором:
В общем, появилась новая проблема, связанная также с Javascript. Проблема касается непосредственно метода SetPanelEvent и цикла, в котором он вызывается.
Есть код
Код:
var unitClass = {
	'basic_unit_melee_1' : '#unit_dragon_knight1',
	'basic_unit_melee_2' : '#unit_dragon_knight2',
	'basic_unit_melee_3' : '#unit_dragon_knight3',
	'basic_unit_melee_4' : '#unit_dragon_knight4',
	'basic_unit_melee_5' : '#unit_dragon_knight5',
	'basic_unit_melee_6' : '#unit_dragon_knight6',
	'basic_unit_melee_7' : '#unit_dragon_knight7',
	'basic_unit_range_1' : '#unit_sniper1',
	'basic_unit_range_2' : '#unit_sniper2',
	'basic_unit_range_3' : '#unit_sniper3',
	'basic_unit_range_4' : '#unit_sniper4',
	'basic_unit_range_5' : '#unit_sniper5',
	'basic_unit_range_6' : '#unit_sniper6',
	'basic_unit_range_7' : '#unit_sniper7',
	'basic_unit_special_1' : '#unit_special1',
	'basic_unit_special_2' : '#unit_special2',
	'basic_unit_special_3' : '#unit_special3',
	'basic_unit_special_4' : '#unit_special4',
	'basic_unit_special_5' : '#unit_special5',
};
var unitTooltip = {
	'basic_unit_melee_1' : '#tooltip_basic_unit_melee_1',
	'basic_unit_melee_2' : '#tooltip_basic_unit_melee_2',
	'basic_unit_melee_3' : '#tooltip_basic_unit_melee_3',
	'basic_unit_melee_4' : '#tooltip_basic_unit_melee_4',
	'basic_unit_melee_5' : '#tooltip_basic_unit_melee_5',
	'basic_unit_melee_6' : '#tooltip_basic_unit_melee_6',
	'basic_unit_melee_7' : '#tooltip_basic_unit_melee_7',
	'basic_unit_range_1' : '#tooltip_basic_unit_range_1',
	'basic_unit_range_2' : '#tooltip_basic_unit_range_2',
	'basic_unit_range_3' : '#tooltip_basic_unit_range_3',
	'basic_unit_range_4' : '#tooltip_basic_unit_range_4',
	'basic_unit_range_5' : '#tooltip_basic_unit_range_5',
	'basic_unit_range_6' : '#tooltip_basic_unit_range_6',
	'basic_unit_range_7' : '#tooltip_basic_unit_range_7',
	'basic_unit_special_1' : '#tooltip_basic_unit_special_1',
	'basic_unit_special_2' : '#tooltip_basic_unit_special_2',
	'basic_unit_special_3' : '#tooltip_basic_unit_special_3',
	'basic_unit_special_4' : '#tooltip_basic_unit_special_4',
	'basic_unit_special_5' : '#tooltip_basic_unit_special_5',
};

	for(var i in unitClass)
	{
		var thisclass = $(unitClass[i]);
		thisclass.SetDialogVariable("tests", "ofcourse");
		thisclass.SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", thisclass, $.Localize(unitTooltip[i]));});
		thisclass.SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", thisclass);});	
	}
Результат такого кода, курсор при этом наведён на иконку луны:
rvQKQXN.jpg


Если же сделать топорно:
Код:
var unitClass = {
	'basic_unit_melee_1' : '#unit_dragon_knight1',
	'basic_unit_melee_2' : '#unit_dragon_knight2',
	'basic_unit_melee_3' : '#unit_dragon_knight3',
	'basic_unit_melee_4' : '#unit_dragon_knight4',
	'basic_unit_melee_5' : '#unit_dragon_knight5',
	'basic_unit_melee_6' : '#unit_dragon_knight6',
	'basic_unit_melee_7' : '#unit_dragon_knight7',
	'basic_unit_range_1' : '#unit_sniper1',
	'basic_unit_range_2' : '#unit_sniper2',
	'basic_unit_range_3' : '#unit_sniper3',
	'basic_unit_range_4' : '#unit_sniper4',
	'basic_unit_range_5' : '#unit_sniper5',
	'basic_unit_range_6' : '#unit_sniper6',
	'basic_unit_range_7' : '#unit_sniper7',
	'basic_unit_special_1' : '#unit_special1',
	'basic_unit_special_2' : '#unit_special2',
	'basic_unit_special_3' : '#unit_special3',
	'basic_unit_special_4' : '#unit_special4',
	'basic_unit_special_5' : '#unit_special5',
};

var unitTooltip = {
	'basic_unit_melee_1' : $.Localize('#tooltip_basic_unit_melee_1'),
	'basic_unit_melee_2' : $.Localize('#tooltip_basic_unit_melee_2'),
	'basic_unit_melee_3' : $.Localize('#tooltip_basic_unit_melee_3'),
	'basic_unit_melee_4' : $.Localize('#tooltip_basic_unit_melee_4'),
	'basic_unit_melee_5' : $.Localize('#tooltip_basic_unit_melee_5'),
	'basic_unit_melee_6' : $.Localize('#tooltip_basic_unit_melee_6'),
	'basic_unit_melee_7' : $.Localize('#tooltip_basic_unit_melee_7'),
	'basic_unit_range_1' : $.Localize('#tooltip_basic_unit_range_1'),
	'basic_unit_range_2' : $.Localize('#tooltip_basic_unit_range_2'),
	'basic_unit_range_3' : $.Localize('#tooltip_basic_unit_range_3'),
	'basic_unit_range_4' : $.Localize('#tooltip_basic_unit_range_4'),
	'basic_unit_range_5' : $.Localize('#tooltip_basic_unit_range_5'),
	'basic_unit_range_6' : $.Localize('#tooltip_basic_unit_range_6'),
	'basic_unit_range_7' : $.Localize('#tooltip_basic_unit_range_7'),
	'basic_unit_special_1' : $.Localize('#tooltip_basic_unit_special_1'),
	'basic_unit_special_2' : $.Localize('#tooltip_basic_unit_special_2'),
	'basic_unit_special_3' : $.Localize('#tooltip_basic_unit_special_3'),
	'basic_unit_special_4' : $.Localize('#tooltip_basic_unit_special_4'),
	'basic_unit_special_5' : $.Localize('#tooltip_basic_unit_special_5'),
};

	$("#unit_dragon_knight1").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight1"), unitTooltip['basic_unit_melee_1']);})
	$("#unit_dragon_knight2").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight2"), unitTooltip['basic_unit_melee_2']);})
	$("#unit_dragon_knight3").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight3"), unitTooltip['basic_unit_melee_3']);})
	$("#unit_dragon_knight4").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight4"), unitTooltip['basic_unit_melee_4']);})
	$("#unit_dragon_knight5").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight5"), unitTooltip['basic_unit_melee_5']);})
	$("#unit_dragon_knight6").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight6"), unitTooltip['basic_unit_melee_6']);})
	$("#unit_dragon_knight7").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_dragon_knight7"), unitTooltip['basic_unit_melee_7']);})
	$("#unit_sniper1").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper1"), unitTooltip['basic_unit_range_1']);})
	$("#unit_sniper2").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper2"), unitTooltip['basic_unit_range_2']);})
	$("#unit_sniper3").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper3"), unitTooltip['basic_unit_range_3']);})
	$("#unit_sniper4").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper4"), unitTooltip['basic_unit_range_4']);})
	$("#unit_sniper5").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper5"), unitTooltip['basic_unit_range_5']);})
	$("#unit_sniper6").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper6"), unitTooltip['basic_unit_range_6']);})
	$("#unit_sniper7").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_sniper7"), unitTooltip['basic_unit_range_7']);})
	$("#unit_special1").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_special1"), unitTooltip['basic_unit_special_1']);})
	$("#unit_special2").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_special2"), unitTooltip['basic_unit_special_2']);})
	$("#unit_special3").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_special3"), unitTooltip['basic_unit_special_3']);})
	$("#unit_special4").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_special4"), unitTooltip['basic_unit_special_4']);})
	$("#unit_special5").SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", $("#unit_special5"), unitTooltip['basic_unit_special_5']);})
	
	$("#unit_dragon_knight1").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight1"));})
	$("#unit_dragon_knight2").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight2"));})
	$("#unit_dragon_knight3").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight3"));})
	$("#unit_dragon_knight4").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight4"));})
	$("#unit_dragon_knight5").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight5"));})
	$("#unit_dragon_knight6").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight6"));})
	$("#unit_dragon_knight7").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_dragon_knight7"));})
	$("#unit_sniper1").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper1"));})
	$("#unit_sniper2").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper2"));})
	$("#unit_sniper3").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper3"));})
	$("#unit_sniper4").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper4"));})
	$("#unit_sniper5").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper5"));})
	$("#unit_sniper6").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper6"));})
	$("#unit_sniper7").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_sniper7"));})
	$("#unit_special1").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_special1"));})
	$("#unit_special2").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_special2"));})
	$("#unit_special3").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_special3"));})
	$("#unit_special4").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_special4"));})
	$("#unit_special5").SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", $("#unit_special5"));})
Результат такого кода, курсор при этом наведён всё так же на иконку луны:
YcDnDdF.jpg


То бишь вариант, сделанный топором работает нормально.
Вопрос состоит в том, почему через цикл он присваивает tooltip только последнему элементу массива, и как решить этот момент.
Как-то не комильфо и не гибко писать огромные столбы кода, хотелось бы сократить это всё.
 
Последнее редактирование модератором:
Мне кстати очень понравился твой оригинальный код, а особенно проверка на количество золота исключительно на клиенте
 
По поводу второго вопроса: гугл javascript loop variable capture
Спасибо.
Правильный цикл:
Код:
	for(var i in unitClass)
	{		
		(function() {
			var m = i;
			var thisclass = $(unitClass[m]);
			thisclass.SetDialogVariable("tests", "ofcourse");
			thisclass.SetPanelEvent("onmouseover", function(){ $.DispatchEvent("DOTAShowTextTooltip", thisclass, $.Localize(unitTooltip[m]));});
			thisclass.SetPanelEvent("onmouseout", function(){ $.DispatchEvent("DOTAHideTextTooltip", thisclass);});				
		})(); 
	}
 
Последнее редактирование модератором:
И еще вопрос, переменные в локализации тултипа не работают?
То бишь устанавливается переменная
thisclass.SetDialogVariable("tests", "ofcourse");
В файле перевода
"tooltip_basic_unit_melee_1" " {s:tests} TEST"

В результате получается
SjCygYH.jpg
 
Последнее редактирование модератором:
Во-первых есть замечательный раздел про локализацию на вики доты.
Во-вторых подумай сам, ты передаешь в $.Localize только строку, откуда она узнает про твои диалог вариаблы, магией?
В-третьих что ты мне сделаешь я в друогм городе $.Localize(token, panel)
 
MahouShoujo, сами то в вики небось не заглядывали.
А за второй аргумент функции $.Localize спасибо, не знал.

Правда, жаль, что пришлось всё абсолютно по-другому делать, на костылях.
 
Primo, уж кто, уж кто, а он на вики живет, наверное, скорее всего, возможно, может быть.
 
[quote author=Primo link=topic=1484.msg10136#msg10136 date=1498062691]
MahouShoujo, сами то в вики небось не заглядывали.
А за второй аргумент функции $.Localize спасибо, не знал.

Правда, жаль, что пришлось всё абсолютно по-другому делать, на костылях.
[/quote]
Ты дурак или да?
 
CryDeS, не хотелось бы устраивать конфликт на пустом месте. Если бы Вы взглянули на вики, то поняли, что там нет конкретного примера тому, что мне нужно. А если взглянете на то, какой код я писал здесь, то Вы поймёте, что я пытался делать конкретно по примерам из вики, хотя там нет решения моей проблемы. Будьте внимательнее.

Как можно убрать превью башен в начале игры, которые от батлпасса зависят, а также анимешное(летящее) представление пика? Либо, какое событие(функция) вызывается, когда пропадает это превью?
 
Он прав. На вики были только примеры SetDialogVariable. А я когда-то просто догадался, что есть второй аргумент.

Реальные примеры есть, например, в сурсах Overthrow.
 
Как можно убрать превью башен в начале игры, которые от батлпасса зависят, а также анимешное(летящее) представление пика? Либо, какое событие(функция) вызывается, когда пропадает это превью?
Решение GameRules:SetShowcaseTime( 0.0 )
 
Последнее редактирование модератором:
Появилась еще одна проблема. В общем, как бы я не пытался сделать, но в консоль при отключении игрока выдаёт CCustomGameEventManager::ScriptSend_ServerToPlayer - Invalid player

Код:
	Timers:CreateTimer(0.15, function()
		for playerID = 0, DOTA_MAX_TEAM_PLAYERS-1 do
			if PlayerResource:IsValidPlayer(playerID) then
				CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer(playerID), "player_think", PlayerResource:GetSelectedHeroEntity(playerID) )
			end
		end
		return 0.15
	end)
 
Последнее редактирование модератором:
Такого игрока нет в игре видимо
 
ZLOY, это логично, но разве PlayerResource:IsValidPlayer не должен проверять это? Или есть другой вариант проверки в игре ли игрок?
 
Реклама: