Решено Стак предметов

Novichek

Активный
18 Фев 2020
123
14
Проект
Evo Land
каким образом можно заставить кастомные предметы стакатся?
"IsStackable" "1" не помогает
 
Укажи параметр
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" //Consumables
 
Укажи параметр
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" //Consumables
Этот параметр отвечает за передачу предмета между игроками.

Как правило эти 3 параметра отвечают за стаки
1) предмет можно стакать
2) предмет уничтожается, когда стаков меньше 0. Например у ботла этот параметр 1, тк использовав все стаки предмет остается у тебя на руках.
3) начальное количество стаков
"ItemStackable" "1"
"ItemPermanent" "0"
"ItemInitialCharges" "1"
 
  • Нравится
Реакции: Novichek
Этот параметр отвечает за передачу предмета между игроками.

Как правило эти 3 параметра отвечают за стаки
1) предмет можно стакать
2) предмет уничтожается, когда стаков меньше 0. Например у ботла этот параметр 1, тк использовав все стаки предмет остается у тебя на руках.
3) начальное количество стаков
"ItemStackable" "1"
"ItemPermanent" "0"
"ItemInitialCharges" "1

Этот параметр отвечает за передачу предмета между игроками.

Как правило эти 3 параметра отвечают за стаки
1) предмет можно стакать
2) предмет уничтожается, когда стаков меньше 0. Например у ботла этот параметр 1, тк использовав все стаки предмет остается у тебя на руках.
3) начальное количество стаков
"ItemStackable" "1"
"ItemPermanent" "0"
"ItemInitialCharges" "1"
проблема в том что предмет который стакается становится серым(отключается) продать нельзя, выкладываешь на землю и подымаешь обратно, стаки слетают. Да и хотелось бы что б цифры были. По анологии как у Танго.
 
Закинь сюда предмет в чем сложность?
"item_rock"
{
// General
//-------------------------------------------------------------------------------------------------------------
"ID" "2278"
"BaseClass" "item_datadriven"
"AbilityTextureName" "my_item/item_rock"
"Model" "models/rock_4.vmdl"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"

// Item Info
//-------------------------------------------------------------------------------------------------------------
"ItemShopTags" "block"
"ItemQuality" "artifact"
"ItemCost" "2"
"ItemPurchasable" "0"
"ItemBaseLevel" "1"
"ItemQuality" "component"
// Stackable Properties
//-------------------------------------------------------------------------------------------------------------
"ItemStackable" "1"
}
 
1) Убери ID
2) Добавь
"ItemStackable" "1"
"ItemPermanent" "0"
"ItemInitialCharges" "1"
3) Что ты вообще хочешь видеть в итоге ибо "BaseClass" "item_datadriven" обрезок с которым невозможно работать, разве что пассивные и не очень дохуя чего активные предметы делать
4) Размер иконки 88x88 формата png путь до которых game\dota_addons\АДДОН\resource\flash3\images\items\тут свои папки или png
 
Последнее редактирование:
1) Убери ID
2) Добавь
"ItemStackable" "1"
"ItemPermanent" "0"
"ItemInitialCharges" "1"
3) Что ты вообще хочешь видеть в итоге ибо "BaseClass" "item_datadriven" обрезок с которым невозможно работать, разве что пассивные и не очень дохуя чего активные предметы делать
4) Размер иконки 88x88 формата png путь до которых game\dota_addons\АДДОН\resource\flash3\images\items\тут свои папки или png
Ну это просто пустая шмотка. Лан попробую. Иконка уже и так есть ток размеры другие правда.
 
1) Убери ID
2) Добавь
"ItemStackable" "1"
"ItemPermanent" "0"
"ItemInitialCharges" "1"
3) Что ты вообще хочешь видеть в итоге ибо "BaseClass" "item_datadriven" обрезок с которым невозможно работать, разве что пассивные и не очень дохуя чего активные предметы делать
4) Размер иконки 88x88 формата png путь до которых game\dota_addons\АДДОН\resource\flash3\images\items\тут свои папки или png
есть проблема. Шмот если стакается то отключается. Суть в том, что б, игрок смог продавать эти айтемы. Приходится выкладывать на землю и тогда срабатывает. Я так понял лучьше код писать?
 
поправ очка. Если шмот выпадает из нпс на землю то тогда такая беда. а если покупаешь то все четенько
 
Тебе получается надо цену за 1 предмет, если их 1+ то цена что бы увеличивалась эквиваленту количества?
Так же что бы работала с системой дропа из существ
 
Тебе получается надо цену за 1 предмет, если их 1+ то цена что бы увеличивалась эквиваленту количества?
Так же что бы работала с системой дропа из существ
цена стакается. Но все равботате только если выкладывать на землю а потом подымать. Шмот выпадает из нпс. когда берешь 1 то все норм когда больше 1 то предмет заглушается
 
Это ты используешь либу видимо item_drop.lua которая часто используется в примерах Виталика
цена стакается. Но все равботате только если выкладывать на землю а потом подымать. Шмот выпадает из нпс. когда берешь 1 то все норм когда больше 1 то предмет заглушается
Насчет заглушки могу подсказать, но так и не понял, как позволить застаканый предмет продавать если его поднимать подряд
Добавить в функцию function ItemDrop:RollItemDrop(unit)
newItem:SetOwner(nil)
newItem:SetPurchaser(nil)
newItem:SetShareability(ITEM_PARTIALLY_SHAREABLE)
 
Это ты используешь либу видимо item_drop.lua которая часто используется в примерах Виталика

Насчет заглушки могу подсказать, но так и не понял, как позволить застаканый предмет продавать если его поднимать подряд
Добавить в функцию function ItemDrop:RollItemDrop(unit)
newItem:SetOwner(nil)
newItem:SetPurchaser(nil)
newItem:SetShareability(ITEM_PARTIALLY_SHAREABLE)
Работает ?

Просто насколько я знаю помню это старая тема, даже у меня в кастомке она не пофикшена (
 
Работает ?

Просто насколько я знаю помню это старая тема, даже у меня в кастомке она не пофикшена (
Да там овнера на предмет при дропе убирает и предмет ничейный становится и его можно взять в стак сразу и он будет без заглушения , но без возможности продать если это стакающийся предмет и его больше чем 1 заряд
 
Последнее редактирование:
Я не могу найти фикс в самом дропе , скорее всего надо фиксить через on_item_pick_up слушатель или как то так, что бы он проверял наличие и добавлял в существующее
 
Последнее редактирование:
Пока ехал на работу придумал 4 способа реализации , если что то сработает , напишу сюда
 
Я победил эту машину ебаную, но теперь только тот - чей удар был последним по NPC того и будет дроп - я ещё пока что не пофиксил эту хуйню, но по крайней мере я зафиксил Item_drop.lua (предмет может стакаться / продаваться)
Lua:
if ItemDrop == nil then
    _G.ItemDrop = class({})
end

-- items - список предметов, которые могут выпасть
-- chance - шанс выпадения (если не определен, то равен 100%) список юнитов из которых могут выпасть предметы ( если не определен, то выпадает с любого юнита)
-- duration - длительность жизни предмета на полу( если не определен, то предмет лежит бесконечно)
-- limit - лимит предметов - количество предметов, которые могут выпасть( если не определен, то количество не ограничено)
-- units - список юнитов, из которых падает предмет

ItemDrop.item_drop = {
--        {items = {"item_branches"}, chance = 5, duration = 5, limit = 3, units = {"npc_name"} },
        {items = {"item_enchanted_mango"}, duration = 5},-- глобальный дроп манго со всех NPC
}

-- point_name - название таргета
-- item_name - название предмета

ItemDrop.secret_items = {
--    ["point_name"] = "item_name",

}
function ItemDrop:InitGameMode()
    ListenToGameEvent('entity_killed', Dynamic_Wrap(self, 'OnEntityKilled'), self)
    ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(self, 'OnGameRulesStateChange'), self)
end

function ItemDrop:OnGameRulesStateChange()
    local newState = GameRules:State_Get()

    if newState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        ItemDrop:SpawnItems()
    end
end

function ItemDrop:SpawnItems()
    local items = self.secret_items
    for point_name,item_name in pairs(items) do
        local point = Entities:FindByName(nil, point_name)
        if point then
            point = point:GetAbsOrigin()
            local newItem = CreateItem( item_name, nil, nil )
            local drop = CreateItemOnPositionSync( point, newItem )
        else
            print("point with name "..point_name.." dont exist !")
        end
    end
end

function ItemDrop:OnEntityKilled( keys )
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
  local name = killedUnit:GetUnitName()
  local team = killedUnit:GetTeam()
  local killerEntity = nil

  if keys.entindex_attacker then
    killerEntity = EntIndexToHScript(keys.entindex_attacker)
  end

  if team ~= DOTA_TEAM_GOODGUYS and name ~= "npc_dota_thinker" then
    ItemDrop:RollItemDrop(killedUnit, killerEntity)
  end
end

function ItemDrop:RollItemDrop(killedUnit, killerEntity)
    local unit_name = killedUnit:GetUnitName()

    for _,drop in ipairs(self.item_drop) do
        local items = drop.items or nil
        local items_num = #items
        local units = drop.units or nil -- если юниты не были определены, то срабатывает для любого
        local chance = drop.chance or 100 -- если шанс не был определен, то он равен 100
        local loot_duration = drop.duration or nil -- длительность жизни предмета на земле
        local limit = drop.limit or nil -- лимит предметов
        local item_name = items[1] -- название предмета
        local roll_chance = RandomFloat(0, 100)

        if units then
            for _,current_name in pairs(units) do
                if current_name == unit_name then
                    units = nil
                    break
                end
            end
        end

        if units == nil and (limit == nil or limit > 0) and roll_chance < chance then
            if limit then
                drop.limit = drop.limit - 1
            end

            if items_num > 1 then
                item_name = items[RandomInt(1, #items)]
            end

            local spawnPoint = killedUnit:GetAbsOrigin()
            local newItem = CreateItem( item_name, nil, nil )
            -- Устанавливаем свойства предмета
            newItem:SetStacksWithOtherOwners(true)
            newItem:SetPurchaser(killerEntity)
newItem:SetShareability(ITEM_PARTIALLY_SHAREABLE)
            local drop = CreateItemOnPositionForLaunch( spawnPoint, newItem )
            local dropRadius = RandomFloat( 50, 100 )

            newItem:LaunchLootInitialHeight( false, 0, 150, 0.5, spawnPoint + RandomVector( dropRadius ) )
            if loot_duration then
                newItem:SetContextThink( "KillLoot",
                        function()
                            if drop:IsNull() then
                                return
                            end

                            local nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/veil_of_discord.vpcf", PATTACH_CUSTOMORIGIN, drop )
                            ParticleManager:SetParticleControl( nFXIndex, 0, drop:GetOrigin() )
                            ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 35, 35, 25 ) )
                            ParticleManager:ReleaseParticleIndex( nFXIndex )
                            --    EmitGlobalSound("Item.PickUpWorld")

                            UTIL_Remove( item )
                            UTIL_Remove( drop )
                        end, loot_duration )
            end
        end
    end
end

function KillLoot( item, drop )

    if drop:IsNull() then
        return
    end

    local nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/veil_of_discord.vpcf", PATTACH_CUSTOMORIGIN, drop )
    ParticleManager:SetParticleControl( nFXIndex, 0, drop:GetOrigin() )
    ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 35, 35, 25 ) )
    ParticleManager:ReleaseParticleIndex( nFXIndex )
    --    EmitGlobalSound("Item.PickUpWorld")

    UTIL_Remove( item )
    UTIL_Remove( drop )
end

ItemDrop:InitGameMode()
В чем заключается фикс - я добавил в код, что теперь помимо убитого npc передается в function ItemDrop:RollItemDrop(killedUnit, killerEntity) ещё и убийца, через свойство предмета я определяю кто его владелец (последний кто нанес удар) - тем самым я присваиваю предмет убийце - он не мутится (для владельца) и может продаваться владельцем

Вырезка из кода
newItem:SetStacksWithOtherOwners(true) -- может стакаться владельцем
newItem:SetPurchaser(killerEntity) -- определяет владельца
newItem:SetShareability(ITEM_PARTIALLY_SHAREABLE) -- если предмет спиздил союзник/противник что бы его можно было вернуть владельцу и не слетала возможность продать предмет
 
Последнее редактирование:
Я думаю, что теперь можно:
newItem:SetPurchaser(nil) -- тем самым мы освободим владельца, а в свойстве через слушатель on_item_pick_up мы назначим владельца предмета который его поднял, но это пока только моё воображение

Но в правильной стизе так сказать, кто убил того и тапки... пока что думаю нужно ли реализовывать on_item_pick_up
 
  • Нравится
Реакции: Novichek
Реклама: