Проблема с системой дропа с крипа.

ExcaliburS

Пользователь
22 Сен 2015
25
0
Уже видел эту темку: https://customgames.ru/forum/index.php?topic=158.0
Пытаюсь реализовать это же: https://moddota.com/forums/discussion/257/item-drop-system

В коде не шарю, пользуюсь шаблоном barebones, вот то что я делаю пошагово:
1. В scrpits/kv/item_drops.kv прописываю это:
Код:
"Drops" 
{ 
  "npc_dota_neutral_kobold"
  { 
    "item_monkey_king_bar" "10"
    "item_rapier" "50"
    "item_hood_of_defiance" "100"
  }
}
2. В scripts/vscripts/internal/gamemode.lua прописываю это:
Код:
GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")

ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)

function GameMode:OnEntityKilled( keys )
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
  if killedUnit:IsCreature() then
    RollDrops(killedUnit)
  end
end
3. В scripts/vscripts/addon_game_mode.lua прописываю это:
Код:
function RollDrops(unit)
  local DropInfo = GameRules.DropTable[unit:GetUnitName()]
  if DropInfo then
    for item_name,chance in pairs(DropInfo) do
      if RollPercentage(chance) then
        -- Create the item
        local item = CreateItem(item_name, nil, nil)
        local pos = unit:GetAbsOrigin()
        local drop = CreateItemOnPositionSync( pos, item )
        local pos_launch = pos+RandomVector(RandomFloat(150,200))
        item:LaunchLoot(false, 200, 0.75, pos_launch)
      end
    end
  end
end
 
Последнее редактирование модератором:
С баребонесом сидишь? Баребонес то нормально подключил, работает он?

Я с баребонесом не сижу, поэтому хз, почему во втором пункте у тебя путь такой:
scripts/vscripts/internal/gamemode.lua - видимо, так надо, но если баребонес нормально работает, то исходя из этого пути делай:

Закинь в gamemode.lua (судя по всему, это главный файл баребоньки)

Код:
function RollDrops(unit)
  local DropInfo = GameRules.DropTable[unit:GetUnitName()]
  if DropInfo then
    for item_name,chance in pairs(DropInfo) do
      if RollPercentage(chance) then
        -- Create the item
        local item = CreateItem(item_name, nil, nil)
        local pos = unit:GetAbsOrigin()
        local drop = CreateItemOnPositionSync( pos, item )
        local pos_launch = pos+RandomVector(RandomFloat(150,200))
        item:LaunchLoot(false, 200, 0.75, pos_launch)
      end
    end
  end
end

И дай приставку функции RollDrops(unit) такую же, как и у других функций.
Получится что-то в духе: function GameMode:RollDrops(unit)

GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv") - это пишешь туда же, где в файле найдешь подобные строчки, т.е. начинающиеся с GameRules. (просто под ними добавь эту строку и все) и там же эту пропиши:

ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
 
Последнее редактирование модератором:
С баребонесом сидишь?...

Сделал все как ты сказал, ошибок нет, баребонес работает, при убийстве моба в игре красных ошибок нет, попросту не работает итем дроп.
Кину еще полностью файл scripts/vscripts/internal/gamemode.lua может кто-то найдет какие-то несостыковки.
Код:
-- This function initializes the game mode and is called before anyone loads into the game
-- It can be used to pre-initialize any values/tables that will be needed later
function GameMode:_InitGameMode()
 if GameMode._reentrantCheck then
  return
 end

 -- Setup rules
 GameRules:SetHeroRespawnEnabled( ENABLE_HERO_RESPAWN )
 GameRules:SetUseUniversalShopMode( UNIVERSAL_SHOP_MODE )
 GameRules:SetSameHeroSelectionEnabled( ALLOW_SAME_HERO_SELECTION )
 GameRules:SetHeroSelectionTime( HERO_SELECTION_TIME )
 GameRules:SetPreGameTime( PRE_GAME_TIME)
 GameRules:SetPostGameTime( POST_GAME_TIME )
 GameRules:SetTreeRegrowTime( TREE_REGROW_TIME )
 GameRules:SetUseCustomHeroXPValues ( USE_CUSTOM_XP_VALUES )
 GameRules:SetGoldPerTick(GOLD_PER_TICK)
 GameRules:SetGoldTickTime(GOLD_TICK_TIME)
 GameRules:SetRuneSpawnTime(RUNE_SPAWN_TIME)
 GameRules:SetUseBaseGoldBountyOnHeroes(USE_STANDARD_HERO_GOLD_BOUNTY)
 GameRules:SetHeroMinimapIconScale( MINIMAP_ICON_SIZE )
 GameRules:SetCreepMinimapIconScale( MINIMAP_CREEP_ICON_SIZE )
 GameRules:SetRuneMinimapIconScale( MINIMAP_RUNE_ICON_SIZE )
 GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")



 GameRules:SetFirstBloodActive( ENABLE_FIRST_BLOOD )
 GameRules:SetHideKillMessageHeaders( HIDE_KILL_BANNERS )

 GameRules:SetCustomGameEndDelay( GAME_END_DELAY )
 GameRules:SetCustomVictoryMessageDuration( VICTORY_MESSAGE_DURATION )
 GameRules:SetStartingGold( STARTING_GOLD )

 if SKIP_TEAM_SETUP then
  GameRules:SetCustomGameSetupAutoLaunchDelay( 0 )
  GameRules:LockCustomGameSetupTeamAssignment( true )
  GameRules:EnableCustomGameSetupAutoLaunch( true )
 else
  GameRules:SetCustomGameSetupAutoLaunchDelay( AUTO_LAUNCH_DELAY )
  GameRules:LockCustomGameSetupTeamAssignment( LOCK_TEAM_SETUP )
  GameRules:EnableCustomGameSetupAutoLaunch( ENABLE_AUTO_LAUNCH )
 end


 -- This is multiteam configuration stuff
 if USE_AUTOMATIC_PLAYERS_PER_TEAM then
  local num = math.floor(10 / MAX_NUMBER_OF_TEAMS)
  local count = 0
  for team,number in pairs(TEAM_COLORS) do
   if count >= MAX_NUMBER_OF_TEAMS then
    GameRules:SetCustomGameTeamMaxPlayers(team, 0)
   else
    GameRules:SetCustomGameTeamMaxPlayers(team, num)
   end
   count = count + 1
  end
 else
  local count = 0
  for team,number in pairs(CUSTOM_TEAM_PLAYER_COUNT) do
   if count >= MAX_NUMBER_OF_TEAMS then
    GameRules:SetCustomGameTeamMaxPlayers(team, 0)
   else
    GameRules:SetCustomGameTeamMaxPlayers(team, number)
   end
   count = count + 1
  end
 end

 if USE_CUSTOM_TEAM_COLORS then
  for team,color in pairs(TEAM_COLORS) do
   SetTeamCustomHealthbarColor(team, color[1], color[2], color[3])
  end
 end
 DebugPrint('[BAREBONES] GameRules set')

 --InitLogFile( "log/barebones.txt","")

 -- Event Hooks
 -- All of these events can potentially be fired by the game, though only the uncommented ones have had
 -- Functions supplied for them. If you are interested in the other events, you can uncomment the
 -- ListenToGameEvent line and add a function to handle the event
 ListenToGameEvent('dota_player_gained_level', Dynamic_Wrap(GameMode, 'OnPlayerLevelUp'), self)
 ListenToGameEvent('dota_ability_channel_finished', Dynamic_Wrap(GameMode, 'OnAbilityChannelFinished'), self)
 ListenToGameEvent('dota_player_learned_ability', Dynamic_Wrap(GameMode, 'OnPlayerLearnedAbility'), self)
 ListenToGameEvent('player_connect_full', Dynamic_Wrap(GameMode, '_OnConnectFull'), self)
 ListenToGameEvent('player_disconnect', Dynamic_Wrap(GameMode, 'OnDisconnect'), self)
 ListenToGameEvent('dota_item_purchased', Dynamic_Wrap(GameMode, 'OnItemPurchased'), self)
 ListenToGameEvent('dota_item_picked_up', Dynamic_Wrap(GameMode, 'OnItemPickedUp'), self)
 ListenToGameEvent('last_hit', Dynamic_Wrap(GameMode, 'OnLastHit'), self)
 ListenToGameEvent('dota_non_player_used_ability', Dynamic_Wrap(GameMode, 'OnNonPlayerUsedAbility'), self)
 ListenToGameEvent('player_changename', Dynamic_Wrap(GameMode, 'OnPlayerChangedName'), self)
 ListenToGameEvent('dota_rune_activated_server', Dynamic_Wrap(GameMode, 'OnRuneActivated'), self)
 ListenToGameEvent('dota_player_take_tower_damage', Dynamic_Wrap(GameMode, 'OnPlayerTakeTowerDamage'), self)
 ListenToGameEvent('tree_cut', Dynamic_Wrap(GameMode, 'OnTreeCut'), self)
 ListenToGameEvent('entity_hurt', Dynamic_Wrap(GameMode, 'OnEntityHurt'), self)
 ListenToGameEvent('player_connect', Dynamic_Wrap(GameMode, 'PlayerConnect'), self)
 ListenToGameEvent('dota_player_used_ability', Dynamic_Wrap(GameMode, 'OnAbilityUsed'), self)
 ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(GameMode, '_OnGameRulesStateChange'), self)
 ListenToGameEvent('npc_spawned', Dynamic_Wrap(GameMode, '_OnNPCSpawned'), self)
 ListenToGameEvent('dota_player_pick_hero', Dynamic_Wrap(GameMode, 'OnPlayerPickHero'), self)
 ListenToGameEvent('dota_team_kill_credit', Dynamic_Wrap(GameMode, 'OnTeamKillCredit'), self)
 ListenToGameEvent("player_reconnected", Dynamic_Wrap(GameMode, 'OnPlayerReconnect'), self)

 ListenToGameEvent("dota_illusions_created", Dynamic_Wrap(GameMode, 'OnIllusionsCreated'), self)
 ListenToGameEvent("dota_item_combined", Dynamic_Wrap(GameMode, 'OnItemCombined'), self)
 ListenToGameEvent("dota_player_begin_cast", Dynamic_Wrap(GameMode, 'OnAbilityCastBegins'), self)
 ListenToGameEvent("dota_tower_kill", Dynamic_Wrap(GameMode, 'OnTowerKill'), self)
 ListenToGameEvent("dota_player_selected_custom_team", Dynamic_Wrap(GameMode, 'OnPlayerSelectedCustomTeam'), self)
 ListenToGameEvent("dota_npc_goal_reached", Dynamic_Wrap(GameMode, 'OnNPCGoalReached'), self)

 ListenToGameEvent("player_chat", Dynamic_Wrap(GameMode, 'OnPlayerChat'), self)

 ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
 
 --ListenToGameEvent("dota_tutorial_shop_toggled", Dynamic_Wrap(GameMode, 'OnShopToggled'), self)

 --ListenToGameEvent('player_spawn', Dynamic_Wrap(GameMode, 'OnPlayerSpawn'), self)
 --ListenToGameEvent('dota_unit_event', Dynamic_Wrap(GameMode, 'OnDotaUnitEvent'), self)
 --ListenToGameEvent('nommed_tree', Dynamic_Wrap(GameMode, 'OnPlayerAteTree'), self)
 --ListenToGameEvent('player_completed_game', Dynamic_Wrap(GameMode, 'OnPlayerCompletedGame'), self)
 --ListenToGameEvent('dota_match_done', Dynamic_Wrap(GameMode, 'OnDotaMatchDone'), self)
 --ListenToGameEvent('dota_combatlog', Dynamic_Wrap(GameMode, 'OnCombatLogEvent'), self)
 --ListenToGameEvent('dota_player_killed', Dynamic_Wrap(GameMode, 'OnPlayerKilled'), self)
 --ListenToGameEvent('player_team', Dynamic_Wrap(GameMode, 'OnPlayerTeam'), self)

 --[[This block is only used for testing events handling in the event that Valve adds more in the future
 Convars:RegisterCommand('events_test', function()
   GameMode:StartEventTest()
  end, "events test", 0)]]

 local spew = 0
 if BAREBONES_DEBUG_SPEW then
  spew = 1
 end
 Convars:RegisterConvar('barebones_spew', tostring(spew), 'Set to 1 to start spewing barebones debug info. Set to 0 to disable.', 0)

 -- Change random seed
 local timeTxt = string.gsub(string.gsub(GetSystemTime(), ':', ''), '^0+','')
 math.randomseed(tonumber(timeTxt))

 -- Initialized tables for tracking state
 self.bSeenWaitForPlayers = false
 self.vUserIds = {}

 DebugPrint('[BAREBONES] Done loading Barebones gamemode!\n\n')
 GameMode._reentrantCheck = true
 GameMode:InitGameMode()
 GameMode._reentrantCheck = false
end

mode = nil

-- This function is called as the first player loads and sets up the GameMode parameters
function GameMode:_CaptureGameMode()
 if mode == nil then
  -- Set GameMode parameters
  mode = GameRules:GetGameModeEntity()    
  mode:SetRecommendedItemsDisabled( RECOMMENDED_BUILDS_DISABLED )
  mode:SetCameraDistanceOverride( CAMERA_DISTANCE_OVERRIDE )
  mode:SetCustomBuybackCostEnabled( CUSTOM_BUYBACK_COST_ENABLED )
  mode:SetCustomBuybackCooldownEnabled( CUSTOM_BUYBACK_COOLDOWN_ENABLED )
  mode:SetBuybackEnabled( BUYBACK_ENABLED )
  mode:SetTopBarTeamValuesOverride ( USE_CUSTOM_TOP_BAR_VALUES )
  mode:SetTopBarTeamValuesVisible( TOP_BAR_VISIBLE )
  mode:SetUseCustomHeroLevels ( USE_CUSTOM_HERO_LEVELS )
  mode:SetCustomHeroMaxLevel ( MAX_LEVEL )
  mode:SetCustomXPRequiredToReachNextLevel( XP_PER_LEVEL_TABLE )

  mode:SetBotThinkingEnabled( USE_STANDARD_DOTA_BOT_THINKING )
  mode:SetTowerBackdoorProtectionEnabled( ENABLE_TOWER_BACKDOOR_PROTECTION )

  mode:SetFogOfWarDisabled(DISABLE_FOG_OF_WAR_ENTIRELY)
  mode:SetGoldSoundDisabled( DISABLE_GOLD_SOUNDS )
  mode:SetRemoveIllusionsOnDeath( REMOVE_ILLUSIONS_ON_DEATH )

  mode:SetAlwaysShowPlayerInventory( SHOW_ONLY_PLAYER_INVENTORY )
  mode:SetAnnouncerDisabled( DISABLE_ANNOUNCER )
  if FORCE_PICKED_HERO ~= nil then
   mode:SetCustomGameForceHero( FORCE_PICKED_HERO )
  end
  mode:SetFixedRespawnTime( FIXED_RESPAWN_TIME ) 
  mode:SetFountainConstantManaRegen( FOUNTAIN_CONSTANT_MANA_REGEN )
  mode:SetFountainPercentageHealthRegen( FOUNTAIN_PERCENTAGE_HEALTH_REGEN )
  mode:SetFountainPercentageManaRegen( FOUNTAIN_PERCENTAGE_MANA_REGEN )
  mode:SetLoseGoldOnDeath( LOSE_GOLD_ON_DEATH )
  mode:SetMaximumAttackSpeed( MAXIMUM_ATTACK_SPEED )
  mode:SetMinimumAttackSpeed( MINIMUM_ATTACK_SPEED )
  mode:SetStashPurchasingDisabled ( DISABLE_STASH_PURCHASING )

  for rune, spawn in pairs(ENABLED_RUNES) do
   mode:SetRuneEnabled(rune, spawn)
  end

  mode:SetUnseenFogOfWarEnabled( USE_UNSEEN_FOG_OF_WAR )

  mode:SetDaynightCycleDisabled( DISABLE_DAY_NIGHT_CYCLE )
  mode:SetKillingSpreeAnnouncerDisabled( DISABLE_KILLING_SPREE_ANNOUNCER )
  mode:SetStickyItemDisabled( DISABLE_STICKY_ITEM )

  self:OnFirstPlayerLoaded()
 end 
end

function GameMode:OnEntityKilled( keys )
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
  if killedUnit:IsCreature() then
    RollDrops(killedUnit)
  end
end

function GameMode:RollDrops(unit)
  local DropInfo = GameRules.DropTable[unit:GetUnitName()]
  if DropInfo then
    for item_name,chance in pairs(DropInfo) do
      if RollPercentage(chance) then
        -- Create the item
        local item = CreateItem(item_name, nil, nil)
        local pos = unit:GetAbsOrigin()
        local drop = CreateItemOnPositionSync( pos, item )
        local pos_launch = pos+RandomVector(RandomFloat(150,200))
        item:LaunchLoot(false, 200, 0.75, pos_launch)
      end
    end
  end
end

В scripts/vscripts тоже есть gamemode.lua пробовал закинуть код туда, результат тот же.
 
Последнее редактирование модератором:
Второе и третье в один файл нужно засунуть(например, в iternal/gamemode.lua).
Так же в свою функцию RollDrops добавь парочку print'ов для проверки, вызывается ли она вообще( а в идеале, и перед ее вызовом в onentitykilled тоже поставить print).
Код:
print("OnEntityKilled, called RollDrops function");
 
Последнее редактирование модератором:
Это вот так должно выглядеть?
Код:
function GameMode:OnEntityKilled( keys )
  print("OnEntityKilled, called RollDrops function");
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
  if killedUnit:IsCreature() then
    RollDrops(killedUnit)
  end
end

function GameMode:RollDrops(unit)
  print("OnEntityKilled, called RollDrops function");
  local DropInfo = GameRules.DropTable[unit:GetUnitName()]
  if DropInfo then
    for item_name,chance in pairs(DropInfo) do
      if RollPercentage(chance) then
        -- Create the item
        local item = CreateItem(item_name, nil, nil)
        local pos = unit:GetAbsOrigin()
        local drop = CreateItemOnPositionSync( pos, item )
        local pos_launch = pos+RandomVector(RandomFloat(150,200))
        item:LaunchLoot(false, 200, 0.75, pos_launch)
      end
    end
  end
end
Что и где я должен увидеть от print'a? У меня еще помимо баребонеса стоит один скрипт на респ мобов в addon_game_mode.lua и все по сути.
 
Последнее редактирование модератором:
Я забыл вчера добавить, что тебе надо еще и в строчке

RollDrops(killedUnit)

Изменить название функции (ты же приставку к ней добавил):

GameMode:RollDrops(killedUnit)
 
Поменял, все так же :(
 
Последнее редактирование модератором:
Блок теперь так выглядит?

Код:
function GameMode:OnEntityKilled( keys )
  print("OnEntityKilled, called RollDrops function");
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
  if killedUnit:IsCreature() then
    GameMode:RollDrops(killedUnit)
  end
end

Эт во первых, а во вторых - ты этот блок сам впихнул в файл или же нашел сначала GameMode:OnEntityKilled в файле, а затем в него уже впихнул остальной код?
 
Последнее редактирование модератором:
Кроме того, у тебя

killedUnit:IsCreature() - это проверка на npc из custom_units, а ты используешь стандартных. Сделай просто:

if killedUnit then
GameMode:RollDrops(killedUnit)
end
 
Еще раз спасибо :) Тему можно клоз.
 
Последнее редактирование модератором:
Реклама: