Предметы с кастом статами.

RecoveryIt

Активный
7 Май 2016
75
0
Имеется система дропа, с разными прикалюхами, слушаю смерть существа -> проверяю его на валидность -> дропаю шмотку. При дропе определяется его класс и какая именно шмотка падает(рандом шмотка из таблицы предметов) Пытаюсь прикрутить еще и модификаторы, которые будут выбираться случайным образом из таблицы модификаторов(в заранее созданных). Но не могу придумать как привязать выбранный модификатор к дропнутой шмотке, пробовал делать на событие OnEquip но модификатор всегда меняется если шмотку снимать и одевать. Если у кого есть идеи что можно для этого использовать, буду очень благодарен.
Шмотки пишу в datadriven с RunScript'ами. Но могу и в item_lua, хотя не хотелось бы.

Общий вид того что я хочу: юнит умирает -> выбирается шмотка -> дропаю и устанавливаю класс предмета -> привязываю случайно выбранный модификатор.

Дополню:
Именно привязать, что бы в дальнейшем, я мог убирать этот и именно этот модификатор с владельца, например при снятии предмета. А при одевании возвращать, а не выбирать новый.
 
Последнее редактирование модератором:
Сейчас пришла идея, создать таблицу, и заносить в нее параметры предмета, когда он дропается, а при pickup чекать и вешать на юнита.
Примерно:
Код:
ITEM_TABLE = {{}}
ITEM_TABLE[1]["hero"] = "npc_dota_hero_oracle"
ITEM_TABLE[1]["item_name"] = "item_example_item"
ITEM_TABLE[1]["modifier_name"] = "modifier_test"
ITEM_TABLE[1]["equiped"] = 1
Но как сильно это повлияет на работоспособность мода? Во время игры таблица будет увеличиваться в размерах, причем очень быстро, исходя из правил аддона.
 
Последнее редактирование модератором:
Я думаю, в такой идее иначе не сделать. У тебя выходит "х" модификаторов на "у" вещей различный сочетаний. Либо подготавливаешь таблицу заранее, либо делаешь ее попутно.

Можешь попробовать делать несколько мелких таблиц и реализовывать их через скрытую абилку на герое: т.е. заносить туда все данные, касательно данного героя.

Ну либо углубляться в lua, в его синтаксис, и создавать конечные классы с динамическими таблицами (ну по сути та же реализация через абилки, ток именно через код)
 
Последнее редактирование модератором:
Сейчас пришла идея, создать таблицу, и заносить в нее параметры предмета, когда он дропается, а при pickup чекать и вешать на юнита.
Примерно:
Но как сильно это повлияет на работоспособность мода? Во время игры таблица будет увеличиваться в размерах, причем очень быстро, исходя из правил аддона.
У меня парсится весь items.txt по ходу игру из-за того что мне было лень писать список вручную. На работоспособность влияет не сильно)
И используй не ITEM_TABLE[PLAYER_ID]["HERO"] а лучше ITEM_TABLE[PLAYER_ID].hero, ибо при этом не надо хранить текстовый ключ как отдельную ячейку.
А вообще в луа используются хэш-таблицы, который имеют скорость добавления O(1), как и скорость изменения, как и скорость удаления, что делает их очень быстрыми при работе.
 
Последнее редактирование модератором:
Я думаю, в такой идее иначе не сделать. У тебя выходит "х" модификаторов на "у" вещей различный сочетаний. Либо подготавливаешь таблицу заранее, либо делаешь ее попутно.

Можешь попробовать делать несколько мелких таблиц и реализовывать их через скрытую абилку на герое: т.е. заносить туда все данные, касательно данного героя.

Ну либо углубляться в lua, в его синтаксис, и создавать конечные классы с динамическими таблицами (ну по сути та же реализация через абилки, ток именно через код)

Ну вообще в теории, я могу создать один lua modifier и в функции:
Код:
function modifier_custom_stats:DeclareFunctions()
  local funcs = {
    MODIFIER_PROPERTY_BASEATTACK_BONUSDAMAGE,
    MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT,
    MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
    MODIFIER_PROPERTY_EVASION_CONSTANT,
    MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
    MODIFIER_PROPERTY_HEALTH_BONUS,
    MODIFIER_PROPERTY_MANA_BONUS,
    MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE,
    MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK,
  }

  return funcs
end
добавить все мне нужные проперти, и рандомно подставлять в return, но тогда получится что все шмотки будут вешать один и тот же модифиер, только с разными значениями, а иногда и с одинаковыми. То есть при снятии предметов получится не то что должно. Или я ошибаюсь? И это реализуемо?
 
Последнее редактирование модератором:
Ну они же рандомно будут вешаться, значит все время будет рандомно.
 
Ну они же рандомно будут вешаться, значит все время будет рандомно.

Ну тогда заносить в таблицу не название модифиера , а "MODIFIER_PROPERY_" а в lua modifier подставлять в return значение из таблицы по id игрока или герою ITEM_TABLE[1]["property"]
Этот вариант проще, но сработает ли? и будет он оптимальным, по сравнению с таблицей отдельных модифиеров.
 
Последнее редактирование модератором:
Ты в результате будешь все так же хранить табличку модификаторов, соответствующих id. Это то же самое, еслиб ты хранил таблицу модификаторов, соответствующих герою. Так что оптимальнее не будет.
 
Делаю через таблицы, и образовалась проблемка, предметы дропаются по принципу "RandomInt(1,#item_table)" поэтому очень часто будут падать предметы с одинаковым именем, но разными модификаторами и статами. По факту это будут 2 разные шмотки с одинаковым именем и картинкой. И по идеи в таблице я не смогу различить одну от другой, потому-что, если я не ошибаюсь, единственный способ это имя предмета. Следовательно не смогу правильно определить ее модификатор и статы, которые мне нужно добавить/удалить. Вообщем мне нужен этот индификатор, с помощью которого я бы смог их различать. Полазил по API items, ничего годного найти не могу. Есть идеи, что можно использовать?
 
Последнее редактирование модератором:
Ну тут уже надо мудрить, как в базах данных: делать два ключа (т.е. идентификатора). Один главный, второй вспомогательный. Хз, как это провернуть, голова уже не варит. Но скорее всего через новые имена, которые будешь в процессе создавать. И синтаксис луа. И шлюхи. И таблицы.

[size=1pt]А это не поправишь, ссу**! : D[/size]
 
Оказалось все на много проще:
Код:
    local dropItem = CreateItem( itemName, hHero, hHero )
	dropItem:SetPurchaseTime( 0 )
	local drop = CreateItemOnPositionSync( hUnit:GetAbsOrigin(), dropItem )
	local dropTarget = hUnit:GetAbsOrigin() + RandomVector( RandomFloat( 50, 200 ) )
	dropItem:LaunchLoot( false, 150, 0.5, dropTarget )
     -- Устанавливаю нужные мне параметры для дропнутого предмета.
    dropItem.modifiername = "modifier_test"
    dropItem.itemtype = "common"
Далее в нужной мне функции вывожу эти параметры в консоль:
Код:
 function GameMode:ApplyItemStats(player_id, item)
  local player = PlayerResource:GetPlayer(player_id)
  local hero = PlayerResource:GetSelectedHeroEntity(player_id)
  -- Вывожу в консоль параметры установленые при дропе
  DebugPrint(item.modifiername)
  DebugPrint(item.itemtype)
  -- ####################################
  local item_stats = {}
  item_stats[1] = item:GetSpecialValueFor('str')
  item_stats[2] = item:GetSpecialValueFor('agi')
  item_stats[3] = item:GetSpecialValueFor('int')
  item_stats[4] = item:GetSpecialValueFor('spd')
  item_stats[5] = item:GetSpecialValueFor('def')
  for i = 1, 5 do
   GameMode.HERO_STATS_TABLE[player_id + 1][i] = GameMode.HERO_STATS_TABLE[player_id + 1][i] + item_stats[i]
  end
 CustomGameEventManager:Send_ServerToPlayer(player, "update_stats", {str=GameMode.HERO_STATS_TABLE[player_id + 1][1],
                   agi=GameMode.HERO_STATS_TABLE[player_id + 1][2],
                   int=GameMode.HERO_STATS_TABLE[player_id + 1][3],
                   spd=GameMode.HERO_STATS_TABLE[player_id + 1][4],
                   def=GameMode.HERO_STATS_TABLE[player_id + 1][5]}
                   )
 hero:CalculateStatBonus()
end

Все отлично выводится. Остается только добавить модификатор из item.modifiername и также удалять при снятии.
Не знаю насколько это правильно, но вроде работает. 8)
 
Последнее редактирование модератором:
GameMode.HERO_STATS_TABLE[player_id + 1]["MODIFIER"] = "my_modifier_name"

И если ты в самом модификаторе пропишешь рандом, то каждое обновление модификатора(броня например обновляется несколько раз в секунду) у тебя будут новые числа.
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=885.msg4217#msg4217 date=1462772534]
GameMode.HERO_STATS_TABLE[player_id + 1]["MODIFIER"] = "my_modifier_name"

И если ты в самом модификаторе пропишешь рандом, то каждое обновление модификатора(броня например обновляется несколько раз в секунду) у тебя будут новые числа.
[/quote]

Я уже проверил это, и так делать не буду)
 
Последнее редактирование модератором:
Реклама: