diff --git a/data/talkactions/scripts/melee_damage.lua b/data/talkactions/scripts/melee_damage.lua new file mode 100644 index 0000000..0b5bb47 --- /dev/null +++ b/data/talkactions/scripts/melee_damage.lua @@ -0,0 +1,139 @@ +local weaponSkillsConfig = { + [WEAPON_SWORD] = SKILL_SWORD, + [WEAPON_CLUB] = SKILL_CLUB, + [WEAPON_AXE] = SKILL_AXE, + [WEAPON_DISTANCE] = SKILL_DISTANCE +} + +local function getWeapon(player) + local itemLeft = player:getSlotItem(CONST_SLOT_LEFT) + if itemLeft and itemLeft:getType():getWeaponType() ~= WEAPON_NONE and itemLeft:getType():getWeaponType() ~= WEAPON_SHIELD and itemLeft:getType():getWeaponType() ~= WEAPON_AMMO then + return itemLeft + end + + local itemRight = player:getSlotItem(CONST_SLOT_RIGHT) + if itemRight and itemRight:getType():getWeaponType() ~= WEAPON_NONE and itemRight:getType():getWeaponType() ~= WEAPON_SHIELD and itemRight:getType():getWeaponType() ~= WEAPON_AMMO then + return itemRight + end +end + +local function getDamageFormula(attack, attackSkill, fightMode) + local damage = attack + if fightMode == FIGHTMODE_ATTACK then + damage = math.floor(damage + 2 * damage / 10) + elseif fightMode == FIGHTMODE_DEFENSE then + damage = math.floor(damage - 4 * damage / 10) + end + + local formula = math.floor((5 * (attackSkill) + 50) * damage) + return formula +end + +local function getDamage(attack, attackSkill, fightMode, random1, random2) + local formula = getDamageFormula(attack, attackSkill, fightMode) + local randResult = math.floor(random1 % 100); + local damage = -math.floor((math.ceil(formula * ((random2 % 100 + randResult) / 2) / 10000.))); + return damage +end + +local function getMinDamage(attack, attackSkill, fightMode) + local formula = getDamageFormula(attack, attackSkill, fightMode) + local damage = -math.floor((math.ceil(formula * (0 / 2) / 10000.))); + return damage +end + +local function getMaxDamage(attack, attackSkill, fightMode) + local formula = getDamageFormula(attack, attackSkill, fightMode) + local damage = -math.floor((math.ceil(formula * (198 / 2) / 10000.))); + return damage +end + +local function setVocationDamageIncrease(vocationId, damage) + local knightCloseAttackDamageIncreasePercent = configManager.getNumber(configKeys.KNIGHT_CLOSE_ATTACK_DAMAGE_INCREASE_PERCENT) + if knightCloseAttackDamageIncreasePercent ~= -1 then + damage = math.floor(damage + damage * knightCloseAttackDamageIncreasePercent / 100); + end + + return damage +end + +local function getDefense(creature, random1, random2) + local totalDefense = creature:getType():getDefense() + 1 + local defenseSkill = creature:getType():getSkill() + + local formula = math.floor((5 * (defenseSkill) + 50) * totalDefense) + local randresult = math.floor(random1 % 100) + + return math.floor(formula * ((random2 % 100 + randresult) / 2) / 10000.) +end + +local function rshift(x, by) + return math.floor(x / 2 ^ by) +end + +local function getArmor(creature, rand) + local armor = creature:getType():getArmor() + if armor > 1 then + return rand % rshift(armor, 1) + rshift(armor, 1); + end + + return armor +end + +local function setDamageBlock(creature, damage, random1, random2, randomArmor) + if bit.band(creature:getType():getCombatImmunities(), COMBAT_PHYSICALDAMAGE) == COMBAT_PHYSICALDAMAGE then + return 0 + end + + damage = damage + getDefense(creature, random1, random2) + + if damage >= 0 then + return 0 + end + + if damage < 0 then + print (getArmor(creature, randomArmor)) + damage = damage + getArmor(creature, randomArmor) + if damage >= 0 then + return 0 + end + end + + return damage +end + +function onSay(player, words, param) + local split = param:split(",") + if split[3] == nil then + --player:sendCancelMessage("Insufficient parameters [(exp,skill,loot,magic),percentage,hours].") + --return false + end + + local creature = Creature("Troll") + if creature == nil then + player:sendCancelMessage("The monster does not exist.") + end + + local skillType = SKILL_FIST + local attack = 7 + local weapon = getWeapon(player) + if weapon ~= nil then + attack = weapon:getType():getAttack() + skillType = weaponSkillsConfig[weapon:getType():getWeaponType()] + end + + local damage = setDamageBlock(creature, setVocationDamageIncrease(player:getVocation():getId(), getDamage(attack, player:getSkillLevel(skillType), FIGHTMODE_ATTACK, os.rand(), os.rand())), os.rand(), os.rand(), os.rand()) + local minDamage = setDamageBlock(creature, setVocationDamageIncrease(player:getVocation():getId(), getDamage(attack, player:getSkillLevel(skillType), FIGHTMODE_ATTACK, 0, 0)), 99, 99, rshift(creature:getType():getArmor(), 1) + 1) + local maxDamage = setDamageBlock(creature, setVocationDamageIncrease(player:getVocation():getId(), getDamage(attack, player:getSkillLevel(skillType), FIGHTMODE_ATTACK, 99, 99)), 0, 0, 0) + + print ("TotalDamage:" .. damage) + print ("MinDamage:" .. minDamage) + print ("MaxDamage:" .. maxDamage) + --print (weapon:getType():getAttack()) + --print (shield:getName()) + local message = "" + message = message .. "Offensive Fighting\n" + message = message .. "- Daily kills for red skull " .. 123 .. "\n" + --player:showTextDialog(1998, message, false) + return false +end \ No newline at end of file diff --git a/data/talkactions/talkactions.xml b/data/talkactions/talkactions.xml index 4dd0bd1..104f173 100644 --- a/data/talkactions/talkactions.xml +++ b/data/talkactions/talkactions.xml @@ -56,6 +56,7 @@ + diff --git a/src/luascript.cpp b/src/luascript.cpp index 0028383..5b17983 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -1684,6 +1684,9 @@ void LuaScriptInterface::registerFunctions() registerEnumIn("configKeys", ConfigManager::BLOCK_HEIGHT) registerEnumIn("configKeys", ConfigManager::DROP_ITEMS) registerEnumIn("configKeys", ConfigManager::CLIENT_VERSION) + + // random + registerMethod("os", "rand", LuaScriptInterface::luaRandomRand); // os registerMethod("os", "mtime", LuaScriptInterface::luaSystemTime); @@ -2348,6 +2351,7 @@ void LuaScriptInterface::registerFunctions() registerMethod("MonsterType", "getMaxSummons", LuaScriptInterface::luaMonsterTypeGetMaxSummons); registerMethod("MonsterType", "getArmor", LuaScriptInterface::luaMonsterTypeGetArmor); + registerMethod("MonsterType", "getSkill", LuaScriptInterface::luaMonsterTypeGetSkill); registerMethod("MonsterType", "getDefense", LuaScriptInterface::luaMonsterTypeGetDefense); registerMethod("MonsterType", "getOutfit", LuaScriptInterface::luaMonsterTypeGetOutfit); registerMethod("MonsterType", "getRace", LuaScriptInterface::luaMonsterTypeGetRace); @@ -3888,6 +3892,14 @@ int LuaScriptInterface::luaRawGetMetatable(lua_State* L) return 1; } +// random +int LuaScriptInterface::luaRandomRand(lua_State* L) +{ + // random.rand() + lua_pushnumber(L, rand()); + return 1; +} + // os int LuaScriptInterface::luaSystemTime(lua_State* L) { @@ -11225,6 +11237,19 @@ int LuaScriptInterface::luaMonsterTypeGetArmor(lua_State* L) return 1; } +int LuaScriptInterface::luaMonsterTypeGetSkill(lua_State* L) +{ + // monsterType:getSkill() + MonsterType* monsterType = getUserdata(L, 1); + if (monsterType) { + lua_pushnumber(L, monsterType->info.skill); + } + else { + lua_pushnil(L); + } + return 1; +} + int LuaScriptInterface::luaMonsterTypeGetDefense(lua_State* L) { // monsterType:getDefense() diff --git a/src/luascript.h b/src/luascript.h index 22157a1..7a93938 100644 --- a/src/luascript.h +++ b/src/luascript.h @@ -520,6 +520,9 @@ class LuaScriptInterface static int luaIsType(lua_State* L); static int luaRawGetMetatable(lua_State* L); + // random + static int luaRandomRand(lua_State* L); + // os static int luaSystemTime(lua_State* L); @@ -1161,6 +1164,7 @@ class LuaScriptInterface static int luaMonsterTypeGetMaxSummons(lua_State* L); static int luaMonsterTypeGetArmor(lua_State* L); + static int luaMonsterTypeGetSkill(lua_State* L); static int luaMonsterTypeGetDefense(lua_State* L); static int luaMonsterTypeGetOutfit(lua_State* L); static int luaMonsterTypeGetRace(lua_State* L);