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

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

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

Оффлайн RecoveryIt

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

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

Дополню:
Именно привязать, что бы в дальнейшем, я мог убирать этот и именно этот модификатор с владельца, например при снятии предмета. А при одевании возвращать, а не выбирать новый.
« Последнее редактирование: 08-05-2016, 18:06:21 от RecoveryIt »

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Предметы с кастом статами.
« Ответ #1 : 08-05-2016, 19:06:32 »
Сейчас пришла идея, создать таблицу, и заносить в нее параметры предмета, когда он дропается, а при 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
Но как сильно это повлияет на работоспособность мода? Во время игры таблица будет увеличиваться в размерах, причем очень быстро, исходя из правил аддона.

Оффлайн Илья

  • Супермодератор
  • 2039
  • Мощь: 19
Re: Предметы с кастом статами.
« Ответ #2 : 08-05-2016, 19:15:30 »
Я думаю, в такой идее иначе не сделать. У тебя выходит "х" модификаторов на "у" вещей различный сочетаний. Либо подготавливаешь таблицу заранее, либо делаешь ее попутно.

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

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

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: Предметы с кастом статами.
« Ответ #3 : 08-05-2016, 19:15:51 »
Сейчас пришла идея, создать таблицу, и заносить в нее параметры предмета, когда он дропается, а при pickup чекать и вешать на юнита.
Примерно:
Но как сильно это повлияет на работоспособность мода? Во время игры таблица будет увеличиваться в размерах, причем очень быстро, исходя из правил аддона.
У меня парсится весь items.txt по ходу игру из-за того что мне было лень писать список вручную. На работоспособность влияет не сильно)
И используй не ITEM_TABLE[PLAYER_ID]["HERO"] а лучше ITEM_TABLE[PLAYER_ID].hero, ибо при этом не надо хранить текстовый ключ как отдельную ячейку.
А вообще в луа используются хэш-таблицы, который имеют скорость добавления O(1), как и скорость изменения, как и скорость удаления, что делает их очень быстрыми при работе.

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Предметы с кастом статами.
« Ответ #4 : 08-05-2016, 19:27:13 »
Я думаю, в такой идее иначе не сделать. У тебя выходит "х" модификаторов на "у" вещей различный сочетаний. Либо подготавливаешь таблицу заранее, либо делаешь ее попутно.

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

Ну либо углубляться в 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, но тогда получится что все шмотки будут вешать один и тот же модифиер, только с разными значениями, а иногда и с одинаковыми. То есть при снятии предметов получится не то что должно. Или я ошибаюсь? И это реализуемо?

Оффлайн Илья

  • Супермодератор
  • 2039
  • Мощь: 19
Re: Предметы с кастом статами.
« Ответ #5 : 08-05-2016, 19:44:52 »
Ну они же рандомно будут вешаться, значит все время будет рандомно.

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Предметы с кастом статами.
« Ответ #6 : 08-05-2016, 19:53:51 »
Ну они же рандомно будут вешаться, значит все время будет рандомно.

Ну тогда заносить в таблицу не название модифиера , а "MODIFIER_PROPERY_" а в lua modifier подставлять в return значение из таблицы по id игрока или герою ITEM_TABLE[1]["property"]
Этот вариант проще, но сработает ли? и будет он оптимальным, по сравнению с таблицей отдельных модифиеров.

Оффлайн Илья

  • Супермодератор
  • 2039
  • Мощь: 19
Re: Предметы с кастом статами.
« Ответ #7 : 08-05-2016, 20:20:22 »
Ты в результате будешь все так же хранить табличку модификаторов, соответствующих id. Это то же самое, еслиб ты хранил таблицу модификаторов, соответствующих герою. Так что оптимальнее не будет.

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Предметы с кастом статами.
« Ответ #8 : 08-05-2016, 21:13:43 »
Делаю через таблицы, и образовалась проблемка, предметы дропаются по принципу "RandomInt(1,#item_table)" поэтому очень часто будут падать предметы с одинаковым именем, но разными модификаторами и статами. По факту это будут 2 разные шмотки с одинаковым именем и картинкой. И по идеи в таблице я не смогу различить одну от другой, потому-что, если я не ошибаюсь, единственный способ это имя предмета. Следовательно не смогу правильно определить ее модификатор и статы, которые мне нужно добавить/удалить. Вообщем мне нужен этот индификатор, с помощью которого я бы смог их различать. Полазил по API items, ничего годного найти не могу. Есть идеи, что можно использовать?

Оффлайн Илья

  • Супермодератор
  • 2039
  • Мощь: 19
Re: Предметы с кастом статами.
« Ответ #9 : 08-05-2016, 22:12:44 »
Ну тут уже надо мудрить, как в базах данных: делать два ключа (т.е. идентификатора). Один главный, второй вспомогательный. Хз, как это провернуть, голова уже не варит. Но скорее всего через новые имена, которые будешь в процессе создавать. И синтаксис луа. И шлюхи. И таблицы.

А это не поправишь, ссу**! : D



Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Предметы с кастом статами.
« Ответ #10 : 08-05-2016, 23:13:48 »
Оказалось все на много проще:
Код
        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)
« Последнее редактирование: 08-05-2016, 23:17:20 от RecoveryIt »

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: Предметы с кастом статами.
« Ответ #11 : 09-05-2016, 05:42:14 »
GameMode.HERO_STATS_TABLE[player_id + 1]["MODIFIER"] = "my_modifier_name"

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

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Предметы с кастом статами.
« Ответ #12 : 09-05-2016, 22:24:27 »
GameMode.HERO_STATS_TABLE[player_id + 1]["MODIFIER"] = "my_modifier_name"

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

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