TheLegend
New Member
- Reaction score
- 10
I have a problem with my system that obviously doesn't work... I added display text calls o see what is done and what not... THE PROBLEM IS THAT NOTHING SEEMS TO WORK here is the system (please focus only on public functions)
and the caller/checker
and at last the init
You do understand that I cannot continue my work until I know the database indexing works
JASS:
library AdvancedStatus initializer init
globals
private constant real Period = 0.15
private force f
private group unitsofsystem = CreateGroup()
private integer index
private trigger combat = CreateTrigger()
endglobals
private struct unitdatabase
unit u
unit attacktarget
integer i
integer strength
integer skill
integer agility
integer constitution
integer charisma
integer inteligence
integer defence
integer mindamage
integer maxdamage
endstruct
globals
unitdatabase array datau
endglobals
private function databasecheck takes unit testunit returns integer
local integer testinteger = 0
loop
set testinteger = testinteger +1
exitwhen (testunit == datau[testinteger].u)
endloop
return testinteger
endfunction
private function unitsetvalues takes unit setedunit returns nothing
local integer unitindex
set unitindex = databasecheck(setedunit)
set datau[unitindex].mindamage = R2I(datau[unitindex].strength/10)
set datau[unitindex].maxdamage = 10 + R2I(datau[unitindex].strength/10)
call SetUnitLifePercentBJ(setedunit,(datau[unitindex].constitution * 25.*100)/GetUnitStateSwap(UNIT_STATE_MAX_LIFE, setedunit))
endfunction
private function unitperiodicfilter takes nothing returns nothing
if (GetPlayerController(GetOwningPlayer(GetEnumUnit())) == MAP_CONTROL_USER) and (IsUnitInGroup(GetEnumUnit(),unitsofsystem)== false) then
call GroupAddUnit(unitsofsystem,GetEnumUnit())
set index = index + 1
set datau[index].i = index
set datau[index].u = GetEnumUnit()
set datau[index].strength = 5
set datau[index].skill = 5
set datau[index].agility = 5
set datau[index].constitution = 5
set datau[index].charisma = 5
set datau[index].inteligence = 5
set datau[index].defence = 10
set datau[index].mindamage = 0
set datau[index].maxdamage = 10
call unitsetvalues(GetEnumUnit())
call TriggerRegisterUnitEvent(combat, GetEnumUnit(),EVENT_UNIT_DAMAGED )
endif
endfunction
private function unitperiodicadd takes nothing returns nothing
local group unitinmap = GetUnitsInRectAll(GetPlayableMapRect())
call ForGroupBJ(unitinmap, function unitperiodicfilter)
call DestroyGroup(unitinmap)
endfunction
private function unitattackaction takes nothing returns nothing
local integer idattacker
local integer idattacked
local integer damage
local integer hitchance
local integer critinflictchance
local integer critdodgechance
local integer crit
local unit attacker
local unit attacked
set attacker = GetEventDamageSource()
set idattacker = databasecheck(attacker)
set attacked = datau[idattacker].attacktarget
set idattacked = databasecheck(attacked)
call SetUnitLifeBJ(attacked, GetUnitStateSwap(UNIT_STATE_LIFE, attacked) + GetEventDamage())
if idattacked > 0 then
set critinflictchance = datau[idattacker].skill /(10 * (GetUnitLevel(attacker)+1))
set critdodgechance = datau[idattacked].agility /(10 * (GetUnitLevel(attacked)+1))
if (GetRandomInt(0,100) <= critinflictchance) and not(GetRandomInt(0,100) <= critdodgechance) then
set crit = 2
else
set crit = 1
endif
set hitchance = (datau[idattacker].skill)/(datau[idattacked].skill + datau[idattacked].agility)
set damage = GetRandomInt(datau[idattacker].mindamage, datau[idattacker].maxdamage)*crit - (datau[idattacked].defence /10)
if (damage >= 0) and (GetRandomInt(0, 100)<=hitchance) then
call SetUnitLifeBJ(attacked, GetUnitStateSwap(UNIT_STATE_LIFE, attacked) - damage)
call DisplayTextToPlayer(GetOwningPlayer(attacked),0,0,"Your unit took " + I2S(damage) + " damage.")
call DisplayTextToPlayer(GetOwningPlayer(attacker),0,0,"Your unit dealt " + I2S(damage) + " damage.")
else
call DisplayTextToPlayer(GetOwningPlayer(attacked),0,0,"You took no damage in this attack")
call DisplayTextToPlayer(GetOwningPlayer(attacker),0,0,"You either missed or your attack was absorbed")
endif
else
call ForceAddPlayer(f,GetOwningPlayer(attacker))
call QuestMessageBJ(f,bj_QUESTMESSAGE_WARNING,"Cannot target units that are not in system")
call ForceClear(f)
endif
endfunction
public function display takes player pl, unit plu returns nothing
local integer p
call ForceAddPlayer (f,pl)
set p = databasecheck(plu)
call DisplayTextToForce( f, "Strength " + I2S(datau[p].strength) )
call DisplayTextToForce( f, "Skill " + I2S(datau[p].skill) )
call DisplayTextToForce( f, "Agility " + I2S(datau[p].agility) )
call DisplayTextToForce( f, "Constitution " + I2S(datau[p].constitution) )
call DisplayTextToForce( f, "Charisma " + I2S(datau[p].charisma) )
call DisplayTextToForce( f, "Inteligence " + I2S(datau[p].inteligence) )
call DisplayTextToForce( f, "Unit id " + I2S(datau[p].i) )
call ForceClear(f)
endfunction
private function attackset takes nothing returns nothing
local integer attackerindex
set attackerindex = databasecheck(GetAttacker())
set datau[attackerindex].attacktarget = GetAttackedUnitBJ()
endfunction
private function init takes nothing returns nothing
local trigger t
set t = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(t, Period)
call TriggerAddAction(t, function unitperiodicadd)
call TriggerAddAction(combat, function unitattackaction)
set t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction(t, function attackset)
set t = null
endfunction
endlibrary
and the caller/checker
Trigger:
- INFO DISPLAY
- Events
- Conditions
- Actions
- Custom script: local group selected = GetUnitsSelectedAll(GetTriggerPlayer())
- Custom script: call DisplayTextToForce( GetPlayersAll(), GetPlayerName(GetTriggerPlayer()) + " has requested to see his units status")
- Unit Group - Pick every unit in (selected) and do (Actions)
- Loop - Actions
- Custom script: call AdvancedStatus_display(GetTriggerPlayer(),GetEnumUnit())
- Loop - Actions
- Custom script: call DestroyGroup(selected)
and at last the init
Trigger:
- Melee
- Events
- Map initialization
- Conditions
- Actions
- Do Multiple ActionsFor each (Integer A) from 1 to 12, do (Actions)
- Loop - Actions
- Trigger - Add to INFO DISPLAY <gen> the event (Player - (Player((Integer A))) types a chat message containing INFO as An exact match)
- Loop - Actions
- Do Multiple ActionsFor each (Integer A) from 1 to 12, do (Actions)
- Events
You do understand that I cannot continue my work until I know the database indexing works