mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 19:19:56 +00:00
[Server] Create Worldstate class and implement associated table
This commit is contained in:
parent
07b781cd32
commit
49bf605e8e
6 changed files with 185 additions and 138 deletions
|
@ -45,6 +45,7 @@ set(SERVER
|
||||||
stacktrace.cpp
|
stacktrace.cpp
|
||||||
Window.cpp
|
Window.cpp
|
||||||
Weather.cpp
|
Weather.cpp
|
||||||
|
Worldstate.cpp
|
||||||
BaseMgr.cpp
|
BaseMgr.cpp
|
||||||
Script/CommandController.cpp Script/EventController.cpp Script/LuaState.cpp Script/luaUtils.cpp
|
Script/CommandController.cpp Script/EventController.cpp Script/LuaState.cpp Script/luaUtils.cpp
|
||||||
)
|
)
|
||||||
|
|
|
@ -388,6 +388,11 @@ BaseWorldstate *Networking::getLastWorldstate()
|
||||||
return &baseWorldstate;
|
return &baseWorldstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Worldstate *Networking::getServerWorldstate()
|
||||||
|
{
|
||||||
|
return &serverWorldstate;
|
||||||
|
}
|
||||||
|
|
||||||
int Networking::getCurrentMpNum()
|
int Networking::getCurrentMpNum()
|
||||||
{
|
{
|
||||||
return currentMpNum;
|
return currentMpNum;
|
||||||
|
@ -547,8 +552,12 @@ int Networking::mainLoop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
timerCtrl.tick();
|
timerCtrl.tick();
|
||||||
|
|
||||||
if (updated)
|
if (updated)
|
||||||
|
{
|
||||||
Players::processUpdated();
|
Players::processUpdated();
|
||||||
|
serverWorldstate.update();
|
||||||
|
}
|
||||||
|
|
||||||
const int limit = 60;
|
const int limit = 60;
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <components/openmw-mp/Controllers/WorldstatePacketController.hpp>
|
#include <components/openmw-mp/Controllers/WorldstatePacketController.hpp>
|
||||||
#include <components/openmw-mp/Packets/PacketPreInit.hpp>
|
#include <components/openmw-mp/Packets/PacketPreInit.hpp>
|
||||||
#include <apps/openmw-mp/Script/LuaState.hpp>
|
#include <apps/openmw-mp/Script/LuaState.hpp>
|
||||||
|
#include <apps/openmw-mp/Worldstate.hpp>
|
||||||
|
|
||||||
class MasterClient;
|
class MasterClient;
|
||||||
namespace mwmp
|
namespace mwmp
|
||||||
|
@ -57,6 +58,7 @@ namespace mwmp
|
||||||
BaseActorList *getLastActorList();
|
BaseActorList *getLastActorList();
|
||||||
BaseObjectList *getLastObjectList();
|
BaseObjectList *getLastObjectList();
|
||||||
BaseWorldstate *getLastWorldstate();
|
BaseWorldstate *getLastWorldstate();
|
||||||
|
Worldstate *getServerWorldstate();
|
||||||
|
|
||||||
int getCurrentMpNum();
|
int getCurrentMpNum();
|
||||||
void setCurrentMpNum(int value);
|
void setCurrentMpNum(int value);
|
||||||
|
@ -93,6 +95,8 @@ namespace mwmp
|
||||||
BaseObjectList baseObjectList;
|
BaseObjectList baseObjectList;
|
||||||
BaseWorldstate baseWorldstate;
|
BaseWorldstate baseWorldstate;
|
||||||
|
|
||||||
|
Worldstate serverWorldstate;
|
||||||
|
|
||||||
std::unique_ptr<PlayerPacketController> playerPacketController;
|
std::unique_ptr<PlayerPacketController> playerPacketController;
|
||||||
std::unique_ptr<ActorPacketController> actorPacketController;
|
std::unique_ptr<ActorPacketController> actorPacketController;
|
||||||
std::unique_ptr<ObjectPacketController> objectPacketController;
|
std::unique_ptr<ObjectPacketController> objectPacketController;
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "../Settings.hpp"
|
#include "../Settings.hpp"
|
||||||
#include "../Spells.hpp"
|
#include "../Spells.hpp"
|
||||||
#include "../Weather.hpp"
|
#include "../Weather.hpp"
|
||||||
|
#include "../Worldstate.hpp"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -94,6 +95,7 @@ LuaState::LuaState()
|
||||||
WeatherMgr::Init(*this);
|
WeatherMgr::Init(*this);
|
||||||
|
|
||||||
Players::Init(*this);
|
Players::Init(*this);
|
||||||
|
Worldstate::Init(*this);
|
||||||
|
|
||||||
timerCtrl = make_unique<TimerController>();
|
timerCtrl = make_unique<TimerController>();
|
||||||
TimerController::Init(*this);
|
TimerController::Init(*this);
|
||||||
|
@ -256,144 +258,6 @@ LuaState::LuaState()
|
||||||
mwmp::Networking::getPtr()->setServerPassword(passw);
|
mwmp::Networking::getPtr()->setServerPassword(passw);
|
||||||
});
|
});
|
||||||
|
|
||||||
lua->set_function("setHour", [](double hour) {
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME);
|
|
||||||
|
|
||||||
tempWorldstate.hour = hour;
|
|
||||||
|
|
||||||
Players::for_each([&hour, &packet](Player *player){
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setMonth", [](int month) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME);
|
|
||||||
|
|
||||||
tempWorldstate.month = month;
|
|
||||||
|
|
||||||
Players::for_each([&month, &packet](Player *player){
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setDay", [](int day) {
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME);
|
|
||||||
|
|
||||||
tempWorldstate.day = day;
|
|
||||||
|
|
||||||
Players::for_each([&day, &packet](Player *player){
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setYear", [](int year) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME);
|
|
||||||
|
|
||||||
tempWorldstate.year = year;
|
|
||||||
|
|
||||||
Players::for_each([&year, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setDaysPassed", [](int daysPassed) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME);
|
|
||||||
|
|
||||||
tempWorldstate.daysPassed = daysPassed;
|
|
||||||
|
|
||||||
Players::for_each([&daysPassed, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setTimeScale", [](float timeScale) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME);
|
|
||||||
|
|
||||||
tempWorldstate.timeScale = timeScale;
|
|
||||||
|
|
||||||
Players::for_each([&timeScale, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setPlayerCollisionState", [](bool state) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE);
|
|
||||||
|
|
||||||
tempWorldstate.hasPlayerCollision = state;
|
|
||||||
|
|
||||||
Players::for_each([&state, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setActorCollisionState", [](bool state) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE);
|
|
||||||
|
|
||||||
tempWorldstate.hasActorCollision = state;
|
|
||||||
|
|
||||||
Players::for_each([&state, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("setPlacedObjectCollisionState", [](bool state) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE);
|
|
||||||
|
|
||||||
tempWorldstate.hasPlacedObjectCollision = state;
|
|
||||||
|
|
||||||
Players::for_each([&state, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("useActorCollisionForPlacedObjects", [](bool state) {
|
|
||||||
|
|
||||||
auto packet = mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE);
|
|
||||||
|
|
||||||
tempWorldstate.useActorCollisionForPlacedObjects = state;
|
|
||||||
|
|
||||||
Players::for_each([&state, &packet](Player *player) {
|
|
||||||
|
|
||||||
tempWorldstate.guid = player->guid;
|
|
||||||
packet->setWorldstate(&tempWorldstate);
|
|
||||||
packet->Send(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
lua->set_function("createChannel", [](){
|
lua->set_function("createChannel", [](){
|
||||||
return mwmp::Networking::get().createChannel();
|
return mwmp::Networking::get().createChannel();
|
||||||
});
|
});
|
||||||
|
|
133
apps/openmw-mp/Worldstate.cpp
Normal file
133
apps/openmw-mp/Worldstate.cpp
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||||
|
|
||||||
|
#include "Worldstate.hpp"
|
||||||
|
#include "Networking.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void Worldstate::Init(LuaState &lua)
|
||||||
|
{
|
||||||
|
sol::table worldstateTable = lua.getState()->create_named_table("Worldstate");
|
||||||
|
|
||||||
|
worldstateTable.set_function("setHour", [](double hour) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setHour(hour);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setDay", [](int day) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setDay(day);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setMonth", [](int month) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setMonth(month);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setYear", [](int year) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setYear(year);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setDaysPassed", [](int daysPassed) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setDaysPassed(daysPassed);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setTimeScale", [](float timeScale) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setTimeScale(timeScale);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setPlayerCollisionState", [](bool state) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setPlayerCollisionState(state);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setActorCollisionState", [](bool state) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setActorCollisionState(state);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setPlacedObjectCollisionState", [](bool state) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setPlacedObjectCollisionState(state);
|
||||||
|
});
|
||||||
|
|
||||||
|
worldstateTable.set_function("setActorCollisionForPlacedObjects", [](bool state) {
|
||||||
|
mwmp::Networking::get().get().getServerWorldstate()->setActorCollisionForPlacedObjects(state);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::update()
|
||||||
|
{
|
||||||
|
auto worldstateController = mwmp::Networking::get().getWorldstatePacketController();
|
||||||
|
|
||||||
|
if (shouldUpdateTime)
|
||||||
|
{
|
||||||
|
auto packet = worldstateController->GetPacket(ID_WORLD_TIME);
|
||||||
|
packet->setWorldstate(this);
|
||||||
|
packet->Send(true);
|
||||||
|
|
||||||
|
shouldUpdateTime = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldUpdateCollisionOverrides)
|
||||||
|
{
|
||||||
|
auto packet = worldstateController->GetPacket(ID_WORLD_COLLISION_OVERRIDE);
|
||||||
|
packet->setWorldstate(this);
|
||||||
|
packet->Send(true);
|
||||||
|
|
||||||
|
shouldUpdateCollisionOverrides = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setHour(double inputHour)
|
||||||
|
{
|
||||||
|
hour = inputHour;
|
||||||
|
shouldUpdateTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setDay(int inputDay)
|
||||||
|
{
|
||||||
|
day = inputDay;
|
||||||
|
shouldUpdateTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setMonth(int inputMonth)
|
||||||
|
{
|
||||||
|
month = inputMonth;
|
||||||
|
shouldUpdateTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setYear(int inputYear)
|
||||||
|
{
|
||||||
|
year = inputYear;
|
||||||
|
shouldUpdateTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setDaysPassed(int inputDaysPassed)
|
||||||
|
{
|
||||||
|
daysPassed = inputDaysPassed;
|
||||||
|
shouldUpdateTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setTimeScale(float inputTimeScale)
|
||||||
|
{
|
||||||
|
timeScale = inputTimeScale;
|
||||||
|
shouldUpdateTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setPlayerCollisionState(bool state)
|
||||||
|
{
|
||||||
|
hasPlayerCollision = state;
|
||||||
|
shouldUpdateCollisionOverrides = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setActorCollisionState(bool state)
|
||||||
|
{
|
||||||
|
hasActorCollision = state;
|
||||||
|
shouldUpdateCollisionOverrides = true;
|
||||||
|
}
|
||||||
|
void Worldstate::setPlacedObjectCollisionState(bool state)
|
||||||
|
{
|
||||||
|
hasPlacedObjectCollision = state;
|
||||||
|
shouldUpdateCollisionOverrides = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worldstate::setActorCollisionForPlacedObjects(bool state)
|
||||||
|
{
|
||||||
|
useActorCollisionForPlacedObjects = state;
|
||||||
|
shouldUpdateCollisionOverrides = true;
|
||||||
|
}
|
36
apps/openmw-mp/Worldstate.hpp
Normal file
36
apps/openmw-mp/Worldstate.hpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <RakNetTypes.h>
|
||||||
|
|
||||||
|
#include <components/openmw-mp/Log.hpp>
|
||||||
|
#include <components/openmw-mp/Base/BaseWorldstate.hpp>
|
||||||
|
#include <components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp>
|
||||||
|
|
||||||
|
class LuaState;
|
||||||
|
|
||||||
|
|
||||||
|
class Worldstate : public mwmp::BaseWorldstate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static void Init(LuaState &lua);
|
||||||
|
|
||||||
|
void update();
|
||||||
|
|
||||||
|
void setHour(double hour);
|
||||||
|
void setDay(int day);
|
||||||
|
void setMonth(int month);
|
||||||
|
void setYear(int year);
|
||||||
|
void setDaysPassed(int daysPassed);
|
||||||
|
void setTimeScale(float timeScale);
|
||||||
|
|
||||||
|
void setPlayerCollisionState(bool state);
|
||||||
|
void setActorCollisionState(bool state);
|
||||||
|
void setPlacedObjectCollisionState(bool state);
|
||||||
|
void setActorCollisionForPlacedObjects(bool state);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool shouldUpdateTime, shouldUpdateCollisionOverrides;
|
||||||
|
|
||||||
|
};
|
Loading…
Reference in a new issue