function preventError takes nothing returns nothing
endfunction
Name | Type | is_array | initial_value |
CS_chest | unit | No | |
CS_event | real | No | |
CS_gold | real | No | |
CS_lumber | real | No | |
CS_unlocker | unit | No | |
hash | hashtable | No | |
item | itemcode | No | |
loc | location | No | |
some_chest | integer | No | |
u | unit | No | |
x | real | No | |
y | real | No |
library unitChestLib
/*
Chest System by Chaosy
Desp:
The system easily allows you to give random drop chances to a unit when it is unlock. Even though
the system is designed for chests to drop 'random' items once unlocked, it can also be used as a general
system to drop items from every unit in the map.
Methods:
method spawn takes real x, real y returns nothing
method SetChest takes unit u returns nothing
method addItem takes integer i, integer chance returns nothing
method addKey takes integer i returns nothing
method removeKey takes nothing returns nothing
method addGold takes integer i returns nothing
method removeGold takes integer i returns nothing
method addLumber takes integer i returns nothing
method removeLumber takes integer i returns nothing
method removeItem takes integer someItem returns nothing
method UnlockChest takes unit u returns nothing
*/
// -- Config --
globals
//maxindex allowed, with other words a chest can drop 999 items by default
//note that you can extend the variable above the normal cap (8191)
private constant integer MAX_INDEX = 999
//unit type of the chests used
private constant integer CHEST_TYPE = 'h000'
//animation played when opened
private constant string OPEN_ANIMATION = "stand alternate"
endglobals
// -- System --
struct UnitChest
private integer current = 0
private integer gold = 0
private integer lumber = 0
private integer neededKey = 0
private integer array items[MAX_INDEX]
private integer array dropChance[MAX_INDEX]
unit chest
static method create takes nothing returns thistype
return thistype.allocate()
endmethod
method spawn takes real x, real y returns nothing
set .chest = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), CHEST_TYPE, x, y, 0)
endmethod
method SetChest takes unit u returns nothing
set .chest = u
endmethod
method addItem takes integer i, integer chance returns nothing
set .current = .current + 1
set .items[.current] = i
set .dropChance[.current] = chance
if .current >= MAX_INDEX then
call BJDebugMsg("Error - Chest System: Max index reached, you might want to re-config the system.")
endif
endmethod
method addKey takes integer i returns nothing
set .neededKey = i
endmethod
method removeKey takes nothing returns nothing
set .neededKey = 0
endmethod
method addGold takes integer i returns nothing
set .gold = .gold + i
endmethod
method removeGold takes integer i returns nothing
set .gold = .gold - i
endmethod
method addLumber takes integer i returns nothing
set .lumber = .lumber + i
endmethod
method removeLumber takes integer i returns nothing
set .lumber = .lumber - i
endmethod
method removeItem takes integer someItem returns nothing
local integer i = 0
local integer i2
loop
exitwhen i > .current
if .items[i] == someItem then
set i2 = i + 1
loop
exitwhen i2 > .current
set .items[i2] = .items[i2 - 1]
set .dropChance[i2] = .dropChance[i2 -1]
set i2 = i2 + 1
endloop
set .current = .current - 1
endif
set i = i + 1
endloop
endmethod
method UnlockChest takes unit u returns nothing
local integer rng
local integer i = 0
local integer i2 = 0
local real x = GetUnitX(.chest)
local real y = GetUnitY(.chest)
local player p = GetOwningPlayer(u)
loop
exitwhen i2>= 6
if GetItemTypeId(UnitItemInSlotBJ(u, i2)) == .neededKey or .neededKey == 0 then
set i2 = 6
set udg_CS_gold = .gold
set udg_CS_lumber = .lumber
set udg_CS_chest = .chest
set udg_CS_unlocker = u
set udg_CS_event = 1
set udg_CS_event = 0
call UnitAddAbility(.chest, 'Aloc')
call QueueUnitAnimation(.chest, OPEN_ANIMATION)
if .gold > 0 then
call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + .gold)
endif
if .lumber > 0 then
call SetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER, GetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER) + .lumber)
endif
loop
exitwhen i > .current
set rng = GetRandomInt(1,100)
if rng < .dropChance[i] then
call CreateItem(.items[i], x, y)
endif
set i = i + 1
endloop
endif
set i2 = i2 + 1
endloop
endmethod
endstruct
endlibrary