From 1d20cc9e4b8d5b9a4b33ae17f1384eb65724e1ef Mon Sep 17 00:00:00 2001 From: BeniS Date: Tue, 21 Aug 2012 00:28:19 +1200 Subject: [PATCH] Finalized the mount system and the recently new skills/stats. * Added mount options to the thing menu. * Reworked the mounting/dismounting. * Fixed up some skill module bugs. * Added alerts to stats like health, mana, capacity, and regeneration time (need to revise this one as it currently has no maximum). --- modules/game_interface/gameinterface.lua | 10 +++- modules/game_playermount/playermount.lua | 17 +++++-- modules/game_skills/skills.lua | 62 +++++++++++++++--------- modules/gamelib/player.lua | 23 +++++++++ src/otclient/game.cpp | 2 - src/otclient/game.h | 2 - src/otclient/luafunctions.cpp | 2 +- src/otclient/protocolgameparse.cpp | 2 +- 8 files changed, 85 insertions(+), 35 deletions(-) diff --git a/modules/game_interface/gameinterface.lua b/modules/game_interface/gameinterface.lua index 9fd81e51..7af75deb 100644 --- a/modules/game_interface/gameinterface.lua +++ b/modules/game_interface/gameinterface.lua @@ -251,12 +251,19 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) end if creatureThing then + local localPlayer = g_game.getLocalPlayer() menu:addSeparator() if creatureThing:isLocalPlayer() then menu:addOption(tr('Set Outfit'), function() g_game.requestOutfit() end) - if creatureThing:isPartyMember() --[[and not fighting]] then + if not localPlayer:isMounted() then + menu:addOption(tr('Mount'), function() localPlayer:mount() end) + else + menu:addOption(tr('Dismount'), function() localPlayer:dismount() end) + end + + if creatureThing:isPartyMember() then if creatureThing:isPartyLeader() then if creatureThing:isPartySharedExperienceActive() then menu:addOption(tr('Disable Shared Experience'), function() g_game.partyShareExperience(false) end) @@ -268,7 +275,6 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) end else - local localPlayer = g_game.getLocalPlayer() if g_game.getAttackingCreature() ~= creatureThing then menu:addOption(tr('Attack'), function() g_game.attack(creatureThing) end) else diff --git a/modules/game_playermount/playermount.lua b/modules/game_playermount/playermount.lua index 05040b14..1bd65c4c 100644 --- a/modules/game_playermount/playermount.lua +++ b/modules/game_playermount/playermount.lua @@ -7,13 +7,22 @@ function terminate() end function toggleMount() - if g_game.getFeature(GamePlayerMounts) then - g_game.mount(not g_game.isMounted()) + local player = g_game.getLocalPlayer() + if player then + player:toggleMount() + end +end + +function mount() + local player = g_game.getLocalPlayer() + if player then + player:mount() end end function dismount() - if g_game.getFeature(GamePlayerMounts) then - g_game.mount(false) + local player = g_game.getLocalPlayer() + if player then + player:dismount() end end diff --git a/modules/game_skills/skills.lua b/modules/game_skills/skills.lua index 43d3fbb6..4c1ddd1d 100644 --- a/modules/game_skills/skills.lua +++ b/modules/game_skills/skills.lua @@ -9,6 +9,7 @@ function init() onManaChange = onManaChange, onSoulChange = onSoulChange, onFreeCapacityChange = onFreeCapacityChange, + onTotalCapacityChange = onTotalCapacityChange, onStaminaChange = onStaminaChange, onOfflineTrainingChange = onOfflineTrainingChange, onRegenerationChange = onRegenerationChange, @@ -20,8 +21,7 @@ function init() onBaseSkillChange = onBaseSkillChange }) connect(g_game, { - onGameStart = refresh, - onGameEnd = refresh + onGameStart = refresh }) skillsWindow = g_ui.loadUI('skills.otui', modules.game_interface.getRightPanel()) @@ -40,6 +40,7 @@ function terminate() onManaChange = onManaChange, onSoulChange = onSoulChange, onFreeCapacityChange = onFreeCapacityChange, + onTotalCapacityChange = onTotalCapacityChange, onStaminaChange = onStaminaChange, onOfflineTrainingChange = onOfflineTrainingChange, onRegenerationChange = onRegenerationChange, @@ -60,6 +61,12 @@ function terminate() skillsWindow:destroy() end +function resetSkillColor(id) + local skill = skillsWindow:recursiveGetChildById(id) + local widget = skill:getChildById('value') + widget:setColor('#bbbbbb') +end + function setSkillBase(id, value, baseValue) if baseValue < 1 or value < 1 then return @@ -68,13 +75,13 @@ function setSkillBase(id, value, baseValue) local widget = skill:getChildById('value') if value > baseValue then - widget:setColor('#008b00') + widget:setColor('#008b00') -- green skill:setTooltip(baseValue .. ' + ' .. (value - baseValue)) elseif value < baseValue then - widget:setColor('#008b00') + widget:setColor('#b22222') -- red skill:setTooltip(baseValue .. ' - ' .. (value - baseValue)) else - widget:setColor('#bbbbbb') + widget:setColor('#bbbbbb') -- default skill:removeTooltip() end end @@ -107,6 +114,18 @@ function setSkillPercent(id, percent, tooltip) end end +function checkAlert(id, value, maxValue, threshold) + if value > maxValue or maxValue < 1 then + return + end + local percent = math.floor((value / maxValue) * 100) + if percent < threshold then + setSkillColor(id, '#b22222') -- red + else + resetSkillColor(id) + end +end + function update() local offlineTraining = skillsWindow:recursiveGetChildById('offlineTraining') if not g_game.getFeature(GameOfflineTrainingTime) then @@ -138,8 +157,6 @@ function refresh() onOfflineTrainingChange(player, player:getOfflineTrainingTime()) onRegenerationChange(player, player:getRegenerationTime()) onSpeedChange(player, player:getSpeed()) - onBaseSpeedChange(player, player:getBaseSpeed()) - onBaseMagicLevelChange(player, player:getBaseMagicLevel()) for i=0,6 do onSkillChange(player, i, player:getSkillLevel(i), player:getSkillLevelPercent(i)) @@ -186,10 +203,12 @@ end function onHealthChange(localPlayer, health, maxHealth) setSkillValue('health', tr(health)) + checkAlert('health', health, maxHealth, 30) end function onManaChange(localPlayer, mana, maxMana) setSkillValue('mana', tr(mana)) + checkAlert('mana', mana, maxMana, 30) end function onSoulChange(localPlayer, soul) @@ -198,6 +217,11 @@ end function onFreeCapacityChange(localPlayer, freeCapacity) setSkillValue('capacity', freeCapacity) + checkAlert('capacity', freeCapacity, localPlayer:getTotalCapacity(), 20) +end + +function onTotalCapacityChange(localPlayer, totalCapacity) + checkAlert('capacity', localPlayer:getFreeCapacity(), totalCapacity, 20) end function onStaminaChange(localPlayer, stamina) @@ -228,7 +252,7 @@ function onOfflineTrainingChange(localPlayer, offlineTrainingTime) end function onRegenerationChange(localPlayer, regenerationTime) - if not g_game.getFeature(GamePlayerRegenerationTime) then + if not g_game.getFeature(GamePlayerRegenerationTime) or regenerationTime < 0 then return end local hours = math.floor(regenerationTime / 60) @@ -238,45 +262,37 @@ function onRegenerationChange(localPlayer, regenerationTime) end setSkillValue('regenerationTime', hours .. ":" .. minutes) + checkAlert('regenerationTime', regenerationTime, 30, 20) -- what is max regeneration? end function onSpeedChange(localPlayer, speed) setSkillValue('speed', speed) - setSkillBase('speed', speed, localPlayer:getBaseSpeed()) + onBaseSpeedChange(localPlayer, localPlayer:getBaseSpeed()) end function onBaseSpeedChange(localPlayer, baseSpeed) - local speed = localPlayer:getSpeed() - onSpeedChange(localPlayer, baseSpeed) - - setSkillBase('speed', speed, baseSpeed) + setSkillBase('speed', localPlayer:getSpeed(), baseSpeed) end function onMagicLevelChange(localPlayer, magiclevel, percent) setSkillValue('magiclevel', magiclevel) setSkillPercent('magiclevel', percent, tr('You have %s percent to go', 100 - percent)) - setSkillBase('magiclevel', magiclevel, localPlayer:getBaseMagicLevel()) + onBaseMagicLevelChange(localPlayer, localPlayer:getBaseMagicLevel()) end function onBaseMagicLevelChange(localPlayer, baseMagicLevel) - local magiclevel = localPlayer:getMagicLevel() - onMagicLevelChange(localPlayer, magiclevel, localPlayer:getMagicLevelPercent()) - - setSkillBase('magiclevel', magiclevel, baseMagicLevel) + setSkillBase('magiclevel', localPlayer:getMagicLevel(), baseMagicLevel) end function onSkillChange(localPlayer, id, level, percent) setSkillValue('skillId' .. id, level) setSkillPercent('skillId' .. id, percent, tr('You have %s percent to go', 100 - percent)) - setSkillBase('skillId'..id, level, localPlayer:getSkillBaseLevel(id)) + onBaseSkillChange(localPlayer, id, localPlayer:getSkillBaseLevel(id)) end function onBaseSkillChange(localPlayer, id, baseLevel) - local level = localPlayer:getSkillLevel(id) - onSkillChange(localPlayer, id, level, localPlayer:getSkillLevelPercent(id)) - - setSkillBase('skillId'..id, level, baseLevel) + setSkillBase('skillId'..id, localPlayer:getSkillLevel(id), baseLevel) end \ No newline at end of file diff --git a/modules/gamelib/player.lua b/modules/gamelib/player.lua index 8e324566..f2b50c65 100644 --- a/modules/gamelib/player.lua +++ b/modules/gamelib/player.lua @@ -54,3 +54,26 @@ function Player:hasVip(creatureName) end return false end + +function Player:isMounted() + local outfit = self:getOutfit() + return outfit.mount ~= nil and outfit.mount > 0 +end + +function Player:toggleMount() + if g_game.getFeature(GamePlayerMounts) then + g_game.mount(not self:isMounted()) + end +end + +function Player:mount() + if g_game.getFeature(GamePlayerMounts) then + g_game.mount(true) + end +end + +function Player:dismount() + if g_game.getFeature(GamePlayerMounts) then + g_game.mount(false) + end +end diff --git a/src/otclient/game.cpp b/src/otclient/game.cpp index fdf6da20..00fb34cd 100644 --- a/src/otclient/game.cpp +++ b/src/otclient/game.cpp @@ -53,7 +53,6 @@ void Game::resetGameStates() m_online = false; m_denyBotCall = false; m_dead = false; - m_mounted = false; m_serverBeat = 50; m_seq = 0; m_canReportBugs = false; @@ -1079,7 +1078,6 @@ void Game::mount(bool mount) return; m_protocolGame->sendMountStatus(mount); - m_mounted = mount; } void Game::requestItemInfo(const ItemPtr& item, int index) diff --git a/src/otclient/game.h b/src/otclient/game.h index 142b737c..fa02a5f9 100644 --- a/src/otclient/game.h +++ b/src/otclient/game.h @@ -251,7 +251,6 @@ public: bool isDead() { return m_dead; } bool isAttacking() { return !!m_attackingCreature; } bool isFollowing() { return !!m_followingCreature; } - bool isMounted() { return m_mounted; } ContainerPtr getContainer(int index) { return m_containers[index]; } std::map getContainers() { return m_containers; } @@ -288,7 +287,6 @@ private: bool m_online; bool m_denyBotCall; bool m_dead; - bool m_mounted; int m_serverBeat; uint m_seq; Otc::FightModes m_fightMode; diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index 55960116..955128b1 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -199,7 +199,6 @@ void OTClient::registerLuaFunctions() g_lua.bindSingletonFunction("g_game", "isDead", &Game::isDead, &g_game); g_lua.bindSingletonFunction("g_game", "isAttacking", &Game::isAttacking, &g_game); g_lua.bindSingletonFunction("g_game", "isFollowing", &Game::isFollowing, &g_game); - g_lua.bindSingletonFunction("g_game", "isMounted", &Game::isMounted, &g_game); g_lua.bindSingletonFunction("g_game", "getContainer", &Game::getContainer, &g_game); g_lua.bindSingletonFunction("g_game", "getContainers", &Game::getContainers, &g_game); g_lua.bindSingletonFunction("g_game", "getVips", &Game::getVips, &g_game); @@ -380,6 +379,7 @@ void OTClient::registerLuaFunctions() g_lua.bindClassMemberFunction("setStates", &LocalPlayer::setStates); g_lua.bindClassMemberFunction("setSkill", &LocalPlayer::setSkill); g_lua.bindClassMemberFunction("setHealth", &LocalPlayer::setHealth); + g_lua.bindClassMemberFunction("setTotalCapacity", &LocalPlayer::setTotalCapacity); g_lua.bindClassMemberFunction("setFreeCapacity", &LocalPlayer::setFreeCapacity); g_lua.bindClassMemberFunction("setExperience", &LocalPlayer::setExperience); g_lua.bindClassMemberFunction("setLevel", &LocalPlayer::setLevel); diff --git a/src/otclient/protocolgameparse.cpp b/src/otclient/protocolgameparse.cpp index d9b0b3dc..6531bf14 100644 --- a/src/otclient/protocolgameparse.cpp +++ b/src/otclient/protocolgameparse.cpp @@ -1465,7 +1465,7 @@ Outfit ProtocolGame::getOutfit(const InputMessagePtr& msg) } if(g_game.getFeature(Otc::GamePlayerMounts)) { - int mount = msg->getU16(); // mount + int mount = msg->getU16(); outfit.setMount(mount); }