diff --git a/apps/openmw-mp/Player.cpp b/apps/openmw-mp/Player.cpp index 7105423bf..e2a9bcbf4 100644 --- a/apps/openmw-mp/Player.cpp +++ b/apps/openmw-mp/Player.cpp @@ -86,6 +86,7 @@ void Player::Init(LuaState &lua) "getFactions", &Player::getFactions, "getQuests", &Player::getQuests, "getSpells", &Player::getSpells, + "getWeatherMgr", &Player::getWeatherMgr, "getCellState", &Player::getCellState, "cellStateSize", &Player::cellStateSize, @@ -104,7 +105,7 @@ void Player::Init(LuaState &lua) Player::Player(RakNet::RakNetGUID guid) : BasePlayer(guid), NetActor(), changedMap(false), cClass(this), settings(this), books(this), gui(this), dialogue(this), factions(this), - quests(this), spells(this) + quests(this), spells(this), weatherMgr(this) { basePlayer = this; netCreature = this; @@ -228,6 +229,7 @@ void Player::update() factions.update(); quests.update(); spells.update(); + weatherMgr.update(); resetUpdateFlags(); } @@ -732,6 +734,11 @@ Spells &Player::getSpells() return spells; } +WeatherMgr &Player::getWeatherMgr() +{ + return weatherMgr; +} + std::tuple Player::getPreviousCellPos() const { return make_tuple(previousCellPosition.pos[0], previousCellPosition.pos[1], previousCellPosition.pos[2]); diff --git a/apps/openmw-mp/Player.hpp b/apps/openmw-mp/Player.hpp index 9b7ac4c24..5f7ec5444 100644 --- a/apps/openmw-mp/Player.hpp +++ b/apps/openmw-mp/Player.hpp @@ -34,6 +34,7 @@ #include "Spells.hpp" #include "NetActor.hpp" #include "CellState.hpp" +#include "Weather.hpp" class Player : public mwmp::BasePlayer, public NetActor { @@ -183,6 +184,7 @@ public: Factions &getFactions(); Quests &getQuests(); Spells &getSpells(); + WeatherMgr &getWeatherMgr(); void setAuthority(); @@ -201,6 +203,7 @@ private: Factions factions; Quests quests; Spells spells; + WeatherMgr weatherMgr; sol::table customData; bool markedForDeletion; }; diff --git a/apps/openmw-mp/Script/LuaState.cpp b/apps/openmw-mp/Script/LuaState.cpp index 7fa12ae9f..33a7c168e 100644 --- a/apps/openmw-mp/Script/LuaState.cpp +++ b/apps/openmw-mp/Script/LuaState.cpp @@ -33,6 +33,7 @@ #include "../Quests.hpp" #include "../Settings.hpp" #include "../Spells.hpp" +#include "../Weather.hpp" using namespace std; @@ -91,6 +92,7 @@ LuaState::LuaState() Effect::Init(*this); Spell::Init(*this); Spells::Init(*this); + WeatherMgr::Init(*this); Players::Init(*this); diff --git a/apps/openmw-mp/Weather.cpp b/apps/openmw-mp/Weather.cpp new file mode 100644 index 000000000..df9832f51 --- /dev/null +++ b/apps/openmw-mp/Weather.cpp @@ -0,0 +1,111 @@ +// +// Created by koncord on 30.11.17. +// + +#include "Weather.hpp" +#include "Script/LuaState.hpp" +#include "Networking.hpp" +#include +#include +#include + +using namespace std; +using namespace mwmp; + +void WeatherMgr::Init(LuaState &lua) +{ + lua.getState()->new_usertype("WeatherMgr", + "current", sol::property(&WeatherMgr::getCurrent, &WeatherMgr::setCurrent), + "next", sol::property(&WeatherMgr::getNext, &WeatherMgr::setNext), + "transitionFactor", sol::property(&WeatherMgr::getTransition, &WeatherMgr::setTransition), + "updateTime", sol::property(&WeatherMgr::getUpdate, &WeatherMgr::setUpdate), + "copy", &WeatherMgr::copy, + "setWeather", &WeatherMgr::setWeather, + "request", &WeatherMgr::requestWeather + ); +} + +WeatherMgr::WeatherMgr(Player *player) : player(player), changed(false) +{ + +} + +void WeatherMgr::setWeather(int weather) +{ + changed = true; + + player->weather.nextWeather = weather; + player->weather.transitionFactor = 0.0f; + player->weather.updateTime = 0.0f; +} + +void WeatherMgr::update() +{ + if (!changed) + return; + changed = false; + + auto packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_GAME_WEATHER); + + packet->setPlayer(player); + + packet->Send(/*toOthers*/ false); +} + +void WeatherMgr::setCurrent(int weather) +{ + player->weather.currentWeather = weather; + changed = true; +} + +int WeatherMgr::getCurrent() const +{ + return player->weather.currentWeather; +} + +void WeatherMgr::setNext(int weather) +{ + player->weather.nextWeather = weather; + changed = true; +} + +int WeatherMgr::getNext() const +{ + return player->weather.nextWeather; +} + +void WeatherMgr::setTransition(float time) +{ + player->weather.transitionFactor = time; + changed = true; +} + +float WeatherMgr::getTransition() const +{ + return player->weather.transitionFactor; +} + +void WeatherMgr::setUpdate(float time) +{ + player->weather.updateTime = time; + changed = true; +} + +float WeatherMgr::getUpdate() const +{ + return player->weather.updateTime; +} + +void WeatherMgr::requestWeather() +{ + auto packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_GAME_WEATHER); + packet->RequestData(player->guid); +} + +void WeatherMgr::copy(const WeatherMgr &other) +{ + if(other.player == player) + return; + player->weather = other.player->weather; + changed = true; +} diff --git a/apps/openmw-mp/Weather.hpp b/apps/openmw-mp/Weather.hpp new file mode 100644 index 000000000..57434dcd1 --- /dev/null +++ b/apps/openmw-mp/Weather.hpp @@ -0,0 +1,45 @@ +// +// Created by koncord on 30.11.17. +// + +#pragma once + +#include +#include + +class Player; + +class WeatherMgr +{ +public: + static void Init(LuaState &lua); +public: + explicit WeatherMgr(Player *player); + ~WeatherMgr() = default; + + void update(); + + void setWeather(int weather); + + void setCurrent(int weather); + int getCurrent() const; + + void setNext(int weather); + int getNext() const; + + void setTransition(float time); + float getTransition() const; + + void setUpdate(float time); + float getUpdate() const; + + void requestWeather(); + + void copy(const WeatherMgr &other); + +private: + Player *player; + bool changed; +}; + +