CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Primo

  • 52
  • Мощь: 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.

Чего я хочу добиться. Я хочу, чтобы не было зависимости кол-во геров <-> кол-во юнитов.
« Последнее редактирование: 18-06-2017, 12:07:12 от Илья »

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
Ну так регистрируй 1 раз, а не каждый раз когда герой появляется в игре.

Оффлайн MahouShoujo

  • Продвинутый
  • 201
  • Мощь: 3
Цитировать
Я хочу, чтобы не было зависимости кол-во геров <-> кол-во юнитов.

Зависимости которую ты сам и добавил.

Оффлайн Primo

  • 52
  • Мощь: 0
В общем, появилась новая проблема, связанная также с 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);});
}
[свернуть]
Результат такого кода, курсор при этом наведён на иконку луны:


Если же сделать топорно:
Спойлер
Код
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"));})
[свернуть]
Результат такого кода, курсор при этом наведён всё так же на иконку луны:


То бишь вариант, сделанный топором работает нормально.
Вопрос состоит в том, почему через цикл он присваивает tooltip только последнему элементу массива, и как решить этот момент.
Как-то не комильфо и не гибко писать огромные столбы кода, хотелось бы сократить это всё.

Оффлайн MahouShoujo

  • Продвинутый
  • 201
  • Мощь: 3
Мне кстати очень понравился твой оригинальный код, а особенно проверка на количество золота исключительно на клиенте

Оффлайн MahouShoujo

  • Продвинутый
  • 201
  • Мощь: 3
По поводу второго вопроса: гугл javascript loop variable capture

Оффлайн Primo

  • 52
  • Мощь: 0
По поводу второго вопроса: гугл 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);});
})();
}

Оффлайн Primo

  • 52
  • Мощь: 0
И еще вопрос, переменные в локализации тултипа не работают?
То бишь устанавливается переменная
thisclass.SetDialogVariable("tests", "ofcourse");
В файле перевода
"tooltip_basic_unit_melee_1"   " {s:tests} TEST"

В результате получается

      

Оффлайн MahouShoujo

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

Оффлайн Primo

  • 52
  • Мощь: 0
MahouShoujo, сами то в вики небось не заглядывали.
А за второй аргумент функции $.Localize спасибо, не знал.

Правда, жаль, что пришлось всё абсолютно по-другому делать, на костылях.

Оффлайн I_GRIN_I

  • Продвинутый
  • 608
  • Мощь: 11
  • Научиться бы скриптить...
Primo, уж кто, уж кто, а он на вики живет, наверное, скорее всего, возможно, может быть.
« Последнее редактирование: 21-06-2017, 22:06:55 от I_GRIN_I »

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
MahouShoujo, сами то в вики небось не заглядывали.
А за второй аргумент функции $.Localize спасибо, не знал.

Правда, жаль, что пришлось всё абсолютно по-другому делать, на костылях.
Ты дурак или да?

Оффлайн Primo

  • 52
  • Мощь: 0
CryDeS, не хотелось бы устраивать конфликт на пустом месте. Если бы Вы взглянули на вики, то поняли, что там нет конкретного примера тому, что мне нужно. А если взглянете на то, какой код я писал здесь, то Вы поймёте, что я пытался делать конкретно по примерам из вики, хотя там нет решения моей проблемы. Будьте внимательнее.

Как можно убрать превью башен в начале игры, которые от батлпасса зависят, а также анимешное(летящее) представление пика? Либо, какое событие(функция) вызывается, когда пропадает это превью?
« Последнее редактирование: 22-06-2017, 12:12:10 от Primo »

Оффлайн MahouShoujo

  • Продвинутый
  • 201
  • Мощь: 3
Он прав. На вики были только примеры SetDialogVariable. А я когда-то просто догадался, что есть второй аргумент.

Реальные примеры есть, например, в сурсах Overthrow.

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
developer.valvesoftware.com/...ript/API
про локалайз написано тут, причем количество аргументов не указано точное, значит их скорее всего несколько. не?