mirror of
https://github.com/edubart/otclient.git
synced 2025-10-15 12:04:55 +02:00
Game control precision edits and many other fixes:
* Updated the walking(mouse/keys) control to be a lot more responsive/smooth! * Updated creature diagonal steps to animate faster (due to demand). * Added a warning popup for boost walker option in cipsoft servers. * Added KeyUp event controls in the g_keyboard class. * Fixed an issue with the minimap not reconfiguring. * Fixed a bug with creature lights drawing properly. * Fixed refreshContainer method. * Some layout edits. * Some minor typo fixes. TODO: * Add walk event stack. * Test new walking edits extensively. * Finish pending state feature.
This commit is contained in:
@@ -84,7 +84,7 @@ void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightVie
|
||||
|
||||
if(lightView) {
|
||||
Light light = rawGetThingType()->getLight();
|
||||
if(m_light.intensity != light.intensity && m_light.color != light.color)
|
||||
if(m_light.intensity != light.intensity || m_light.color != light.color)
|
||||
light = m_light;
|
||||
|
||||
// local player always have a minimum light in complete darkness
|
||||
@@ -384,7 +384,7 @@ void Creature::updateWalkAnimation(int totalPixelsWalked)
|
||||
int footAnimPhases = getAnimationPhases() - 1;
|
||||
if(totalPixelsWalked == 32 || footAnimPhases == 0)
|
||||
m_walkAnimationPhase = 0;
|
||||
else if(m_footStepDrawn && m_footTimer.ticksElapsed() >= getStepDuration() / 4 ) {
|
||||
else if(m_footStepDrawn && m_footTimer.ticksElapsed() >= getStepDuration(true) / 4 ) {
|
||||
m_footStep++;
|
||||
m_walkAnimationPhase = 1 + (m_footStep % footAnimPhases);
|
||||
m_footStepDrawn = false;
|
||||
@@ -459,8 +459,7 @@ void Creature::nextWalkUpdate()
|
||||
|
||||
void Creature::updateWalk()
|
||||
{
|
||||
int stepDuration = getStepDuration();
|
||||
float walkTicksPerPixel = stepDuration / 32;
|
||||
float walkTicksPerPixel = getStepDuration(true) / 32;
|
||||
int totalPixelsWalked = std::min(m_walkTimer.ticksElapsed() / walkTicksPerPixel, 32.0f);
|
||||
|
||||
// needed for paralyze effect
|
||||
@@ -472,7 +471,7 @@ void Creature::updateWalk()
|
||||
updateWalkingTile();
|
||||
|
||||
// terminate walk
|
||||
if(m_walking && m_walkTimer.ticksElapsed() >= stepDuration)
|
||||
if(m_walking && m_walkTimer.ticksElapsed() >= getStepDuration())
|
||||
terminateWalk();
|
||||
}
|
||||
|
||||
@@ -670,7 +669,7 @@ Point Creature::getDrawOffset()
|
||||
return drawOffset;
|
||||
}
|
||||
|
||||
int Creature::getStepDuration()
|
||||
int Creature::getStepDuration(bool ignoreDiagonal)
|
||||
{
|
||||
int speed = m_speed;
|
||||
if(g_game.getFeature(Otc::GameNewSpeedLaw))
|
||||
@@ -707,8 +706,8 @@ int Creature::getStepDuration()
|
||||
|
||||
interval = std::max(interval, g_game.getServerBeat());
|
||||
|
||||
if(m_lastStepDirection == Otc::NorthWest || m_lastStepDirection == Otc::NorthEast ||
|
||||
m_lastStepDirection == Otc::SouthWest || m_lastStepDirection == Otc::SouthEast)
|
||||
if(!ignoreDiagonal && (m_lastStepDirection == Otc::NorthWest || m_lastStepDirection == Otc::NorthEast ||
|
||||
m_lastStepDirection == Otc::SouthWest || m_lastStepDirection == Otc::SouthEast))
|
||||
interval *= 3;
|
||||
|
||||
return interval;
|
||||
|
@@ -84,7 +84,7 @@ public:
|
||||
uint8 getEmblem() { return m_emblem; }
|
||||
bool isPassable() { return m_passable; }
|
||||
Point getDrawOffset();
|
||||
int getStepDuration();
|
||||
int getStepDuration(bool ignoreDiagonal = false);
|
||||
Point getWalkOffset() { return m_walkOffset; }
|
||||
Position getLastStepFromPosition() { return m_lastStepFromPosition; }
|
||||
Position getLastStepToPosition() { return m_lastStepToPosition; }
|
||||
|
@@ -495,7 +495,7 @@ bool Game::walk(Otc::Direction direction)
|
||||
if(isFollowing())
|
||||
cancelFollow();
|
||||
|
||||
// msut cancel auto walking and wait next try
|
||||
// must cancel auto walking and wait next try
|
||||
if(m_localPlayer->isAutoWalking()) {
|
||||
m_protocolGame->sendStop();
|
||||
return false;
|
||||
@@ -549,7 +549,7 @@ bool Game::walk(Otc::Direction direction)
|
||||
return true;
|
||||
}
|
||||
|
||||
void Game::autoWalk(const std::vector<Otc::Direction>& dirs)
|
||||
void Game::autoWalk(std::vector<Otc::Direction> dirs)
|
||||
{
|
||||
if(!canPerformGameAction())
|
||||
return;
|
||||
@@ -567,11 +567,16 @@ void Game::autoWalk(const std::vector<Otc::Direction>& dirs)
|
||||
if(isFollowing())
|
||||
cancelFollow();
|
||||
|
||||
Otc::Direction direction = dirs.front();
|
||||
auto it = dirs.begin();
|
||||
Otc::Direction direction = *it;
|
||||
if(m_localPlayer->canWalk(direction)) {
|
||||
TilePtr toTile = g_map.getTile(m_localPlayer->getPosition().translatedToDirection(direction));
|
||||
if(toTile && toTile->isWalkable() && !m_localPlayer->isAutoWalking())
|
||||
{
|
||||
m_localPlayer->preWalk(direction);
|
||||
forceWalk(direction);
|
||||
dirs.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
g_lua.callGlobalField("g_game", "onAutoWalk", dirs);
|
||||
@@ -777,11 +782,11 @@ void Game::close(const ContainerPtr& container)
|
||||
m_protocolGame->sendCloseContainer(container->getId());
|
||||
}
|
||||
|
||||
void Game::refreshContainer()
|
||||
void Game::refreshContainer(const ContainerPtr& container)
|
||||
{
|
||||
if(!canPerformGameAction())
|
||||
return;
|
||||
m_protocolGame->sendRefreshContainer();
|
||||
m_protocolGame->sendRefreshContainer(container->getId());
|
||||
}
|
||||
|
||||
void Game::attack(CreaturePtr creature)
|
||||
@@ -1095,11 +1100,11 @@ void Game::reportBug(const std::string& comment)
|
||||
m_protocolGame->sendBugReport(comment);
|
||||
}
|
||||
|
||||
void Game::reportRuleVilation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment)
|
||||
void Game::reportRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment)
|
||||
{
|
||||
if(!canPerformGameAction())
|
||||
return;
|
||||
m_protocolGame->sendRuleVilation(target, reason, action, comment, statement, statementId, ipBanishment);
|
||||
m_protocolGame->sendRuleViolation(target, reason, action, comment, statement, statementId, ipBanishment);
|
||||
}
|
||||
|
||||
void Game::debugReport(const std::string& a, const std::string& b, const std::string& c, const std::string& d)
|
||||
|
@@ -140,7 +140,7 @@ public:
|
||||
|
||||
// walk related
|
||||
bool walk(Otc::Direction direction);
|
||||
void autoWalk(const std::vector<Otc::Direction>& dirs);
|
||||
void autoWalk(std::vector<Otc::Direction> dirs);
|
||||
void forceWalk(Otc::Direction direction);
|
||||
void turn(Otc::Direction direction);
|
||||
void stop();
|
||||
@@ -159,7 +159,7 @@ public:
|
||||
void open(const ItemPtr& item, const ContainerPtr& previousContainer);
|
||||
void openParent(const ContainerPtr& container);
|
||||
void close(const ContainerPtr& container);
|
||||
void refreshContainer();
|
||||
void refreshContainer(const ContainerPtr& container);
|
||||
|
||||
// attack/follow related
|
||||
void attack(CreaturePtr creature);
|
||||
@@ -225,7 +225,7 @@ public:
|
||||
|
||||
// reports
|
||||
void reportBug(const std::string& comment);
|
||||
void reportRuleVilation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
|
||||
void reportRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
|
||||
void debugReport(const std::string& a, const std::string& b, const std::string& c, const std::string& d);
|
||||
|
||||
// questlog related
|
||||
|
@@ -190,7 +190,7 @@ void LocalPlayer::updateWalkOffset(int totalPixelsWalked)
|
||||
void LocalPlayer::updateWalk()
|
||||
{
|
||||
int stepDuration = getStepDuration();
|
||||
float walkTicksPerPixel = stepDuration / 32.0f;
|
||||
float walkTicksPerPixel = getStepDuration(true) / 32.0f;
|
||||
int totalPixelsWalked = std::min(m_walkTimer.ticksElapsed() / walkTicksPerPixel, 32.0f);
|
||||
|
||||
// update walk animation and offsets
|
||||
|
@@ -194,7 +194,7 @@ void OTClient::registerLuaFunctions()
|
||||
g_lua.bindSingletonFunction("g_game", "acceptTrade", &Game::acceptTrade, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "rejectTrade", &Game::rejectTrade, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "reportBug", &Game::reportBug, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "reportRuleVilation", &Game::reportRuleVilation, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "reportRuleViolation", &Game::reportRuleViolation, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "debugReport", &Game::debugReport, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "editText", &Game::editText, &g_game);
|
||||
g_lua.bindSingletonFunction("g_game", "editList", &Game::editList, &g_game);
|
||||
|
@@ -214,6 +214,7 @@ namespace Proto {
|
||||
ClientInviteToOwnChannel = 171,
|
||||
ClientExcludeFromOwnChannel = 172,
|
||||
ClientCancelAttackAndFollow = 190,
|
||||
ClientUpdateTile = 201,
|
||||
ClientRefreshContainer = 202,
|
||||
ClientRequestOutfit = 210,
|
||||
ClientChangeOutfit = 211,
|
||||
|
@@ -92,14 +92,14 @@ public:
|
||||
void sendInviteToOwnChannel(const std::string& name);
|
||||
void sendExcludeFromOwnChannel(const std::string& name);
|
||||
void sendCancelAttackAndFollow();
|
||||
void sendRefreshContainer();
|
||||
void sendRefreshContainer(int containerId);
|
||||
void sendRequestOutfit();
|
||||
void sendChangeOutfit(const Outfit& outfit);
|
||||
void sendMountStatus(bool mount);
|
||||
void sendAddVip(const std::string& name);
|
||||
void sendRemoveVip(uint playerId);
|
||||
void sendBugReport(const std::string& comment);
|
||||
void sendRuleVilation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
|
||||
void sendRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
|
||||
void sendDebugReport(const std::string& a, const std::string& b, const std::string& c, const std::string& d);
|
||||
void sendRequestQuestLog();
|
||||
void sendRequestQuestLine(int questId);
|
||||
|
@@ -1411,24 +1411,24 @@ void ProtocolGame::parseShowModalDialog(const InputMessagePtr& msg)
|
||||
int sizeButtons = msg->getU8();
|
||||
std::map<int, std::string > buttonList;
|
||||
for(int i = 0; i < sizeButtons; ++i) {
|
||||
std::string name = msg->getString();
|
||||
int value = msg->getU8();
|
||||
buttonList[value] = name;
|
||||
std::string value = msg->getString();
|
||||
int id = msg->getU8();
|
||||
buttonList[id] = value;
|
||||
}
|
||||
|
||||
int sizeChoices = msg->getU8();
|
||||
std::vector<std::tuple<int, std::string> > choiceList;
|
||||
for(int i = 0; i < sizeChoices; ++i) {
|
||||
std::string name = msg->getString();
|
||||
int value = msg->getU8();
|
||||
choiceList.push_back(std::make_tuple(value, name));
|
||||
std::string value = msg->getString();
|
||||
int id = msg->getU8();
|
||||
choiceList.push_back(std::make_tuple(id, value));
|
||||
}
|
||||
|
||||
int enterButton = msg->getU8();
|
||||
int escapeButton = msg->getU8();
|
||||
msg->getU8(); // popup value (no clue what it is for)
|
||||
|
||||
std::map<int, std::string >::iterator itEnter = buttonList.find(enterButton);
|
||||
std::map<int, std::string>::iterator itEnter = buttonList.find(enterButton);
|
||||
if(itEnter == buttonList.end())
|
||||
{
|
||||
g_logger.info(stdext::format("Enter button does not exist for dialog id: %d", id));
|
||||
@@ -1743,7 +1743,7 @@ Position ProtocolGame::getPosition(const InputMessagePtr& msg)
|
||||
{
|
||||
uint16 x = msg->getU16();
|
||||
uint16 y = msg->getU16();
|
||||
uint8 z = msg->getU8();
|
||||
uint8 z = msg->getU8();
|
||||
|
||||
return Position(x, y, z);
|
||||
}
|
||||
|
@@ -629,10 +629,11 @@ void ProtocolGame::sendCancelAttackAndFollow()
|
||||
send(msg);
|
||||
}
|
||||
|
||||
void ProtocolGame::sendRefreshContainer()
|
||||
void ProtocolGame::sendRefreshContainer(int containerId)
|
||||
{
|
||||
OutputMessagePtr msg(new OutputMessage);
|
||||
msg->addU8(Proto::ClientRefreshContainer);
|
||||
msg->addU8(containerId);
|
||||
send(msg);
|
||||
}
|
||||
|
||||
@@ -694,7 +695,7 @@ void ProtocolGame::sendBugReport(const std::string& comment)
|
||||
send(msg);
|
||||
}
|
||||
|
||||
void ProtocolGame::sendRuleVilation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment)
|
||||
void ProtocolGame::sendRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment)
|
||||
{
|
||||
OutputMessagePtr msg(new OutputMessage);
|
||||
msg->addU8(Proto::ClientRuleViolation);
|
||||
|
Reference in New Issue
Block a user