mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-07-21 05:44:06 +00:00
Implement ID_WORLD_DOOR_ACTIVATE and send it from MWBase::World
This commit is contained in:
parent
7264f13b8e
commit
bdb53e1cb4
6 changed files with 79 additions and 0 deletions
|
@ -410,6 +410,9 @@ namespace MWBase
|
||||||
/// @note throws an exception when invoked on a teleport door
|
/// @note throws an exception when invoked on a teleport door
|
||||||
virtual void activateDoor(const MWWorld::Ptr& door, int state) = 0;
|
virtual void activateDoor(const MWWorld::Ptr& door, int state) = 0;
|
||||||
|
|
||||||
|
// Added by tes3mp to allow saving a door state received from a packet
|
||||||
|
virtual void saveDoorState(const MWWorld::Ptr& door, int state) = 0;
|
||||||
|
|
||||||
virtual bool getPlayerStandingOn (const MWWorld::ConstPtr& object) = 0; ///< @return true if the player is standing on \a object
|
virtual bool getPlayerStandingOn (const MWWorld::ConstPtr& object) = 0; ///< @return true if the player is standing on \a object
|
||||||
virtual bool getActorStandingOn (const MWWorld::ConstPtr& object) = 0; ///< @return true if any actor is standing on \a object
|
virtual bool getActorStandingOn (const MWWorld::ConstPtr& object) = 0; ///< @return true if any actor is standing on \a object
|
||||||
virtual bool getPlayerCollidingWith(const MWWorld::ConstPtr& object) = 0; ///< @return true if the player is colliding with \a object
|
virtual bool getPlayerCollidingWith(const MWWorld::ConstPtr& object) = 0; ///< @return true if the player is colliding with \a object
|
||||||
|
|
|
@ -788,6 +788,28 @@ void Networking::ProcessWorldPacket(RakNet::Packet *packet)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ID_WORLD_DOOR_ACTIVATE:
|
||||||
|
{
|
||||||
|
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "%s", "Received ID_WORLD_DOOR_ACTIVATE");
|
||||||
|
LOG_APPEND(Log::LOG_WARN, "- cellRef: %s, %i\n- cell: %s",
|
||||||
|
event->cellRef.mRefID.c_str(),
|
||||||
|
event->cellRef.mRefNum.mIndex,
|
||||||
|
event->cell.getDescription().c_str());
|
||||||
|
|
||||||
|
MWWorld::Ptr ptrFound = ptrCellStore->searchByRefNum(event->cellRef.mRefNum);
|
||||||
|
|
||||||
|
if (ptrFound)
|
||||||
|
{
|
||||||
|
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Found %s, %i",
|
||||||
|
ptrFound.getCellRef().getRefId().c_str(),
|
||||||
|
ptrFound.getCellRef().getRefNum());
|
||||||
|
|
||||||
|
ptrFound.getClass().setDoorState(ptrFound, event->state);
|
||||||
|
MWBase::Environment::get().getWorld()->saveDoorState(ptrFound, event->state);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ID_WORLD_VIDEO_PLAY:
|
case ID_WORLD_VIDEO_PLAY:
|
||||||
{
|
{
|
||||||
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "%s", "Received ID_WORLD_VIDEO_PLAY");
|
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "%s", "Received ID_WORLD_VIDEO_PLAY");
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
#include <osg/ComputeBoundsVisitor>
|
#include <osg/ComputeBoundsVisitor>
|
||||||
|
|
||||||
|
#include <components/openmw-mp/Base/WorldEvent.hpp>
|
||||||
|
#include "../mwmp/Main.hpp"
|
||||||
|
|
||||||
#include <components/esm/esmreader.hpp>
|
#include <components/esm/esmreader.hpp>
|
||||||
#include <components/esm/esmwriter.hpp>
|
#include <components/esm/esmwriter.hpp>
|
||||||
#include <components/esm/cellid.hpp>
|
#include <components/esm/cellid.hpp>
|
||||||
|
@ -2247,18 +2250,55 @@ namespace MWWorld
|
||||||
state = 2; // if opening, then close
|
state = 2; // if opening, then close
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Added by tes3mp
|
||||||
|
mwmp::WorldEvent *event = mwmp::Main::get().getNetworking()->createWorldEvent();
|
||||||
|
event->cell = *door.getCell()->getCell();
|
||||||
|
event->cellRef.mRefID = door.getCellRef().getRefId();
|
||||||
|
event->cellRef.mRefNum = door.getCellRef().getRefNum();
|
||||||
|
event->state = state;
|
||||||
|
mwmp::Main::get().getNetworking()->GetWorldPacket(ID_WORLD_DOOR_ACTIVATE)->Send(event);
|
||||||
|
|
||||||
|
printf("Door activation 1\n- cellRef: %s, %i\n- cell: %s\n- state: %s",
|
||||||
|
event->cellRef.mRefID.c_str(),
|
||||||
|
event->cellRef.mRefNum.mIndex,
|
||||||
|
event->cell.getDescription().c_str(),
|
||||||
|
event->state ? "true" : "false");
|
||||||
|
|
||||||
door.getClass().setDoorState(door, state);
|
door.getClass().setDoorState(door, state);
|
||||||
mDoorStates[door] = state;
|
mDoorStates[door] = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::activateDoor(const Ptr &door, int state)
|
void World::activateDoor(const Ptr &door, int state)
|
||||||
{
|
{
|
||||||
|
// Added by tes3mp
|
||||||
|
mwmp::WorldEvent *event = mwmp::Main::get().getNetworking()->createWorldEvent();
|
||||||
|
event->cell = *door.getCell()->getCell();
|
||||||
|
event->cellRef.mRefID = door.getCellRef().getRefId();
|
||||||
|
event->cellRef.mRefNum = door.getCellRef().getRefNum();
|
||||||
|
event->state = state;
|
||||||
|
mwmp::Main::get().getNetworking()->GetWorldPacket(ID_WORLD_DOOR_ACTIVATE)->Send(event);
|
||||||
|
|
||||||
|
printf("Door activation 2\n- cellRef: %s, %i\n- cell: %s\n- state: %s",
|
||||||
|
event->cellRef.mRefID.c_str(),
|
||||||
|
event->cellRef.mRefNum.mIndex,
|
||||||
|
event->cell.getDescription().c_str(),
|
||||||
|
event->state ? "true" : "false");
|
||||||
|
|
||||||
door.getClass().setDoorState(door, state);
|
door.getClass().setDoorState(door, state);
|
||||||
mDoorStates[door] = state;
|
mDoorStates[door] = state;
|
||||||
if (state == 0)
|
if (state == 0)
|
||||||
mDoorStates.erase(door);
|
mDoorStates.erase(door);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Added by tes3mp to allow saving a door state received from a packet
|
||||||
|
void World::saveDoorState(const Ptr &door, int state)
|
||||||
|
{
|
||||||
|
mDoorStates[door] = state;
|
||||||
|
if (state == 0)
|
||||||
|
mDoorStates.erase(door);
|
||||||
|
}
|
||||||
|
|
||||||
bool World::getPlayerStandingOn (const MWWorld::ConstPtr& object)
|
bool World::getPlayerStandingOn (const MWWorld::ConstPtr& object)
|
||||||
{
|
{
|
||||||
MWWorld::Ptr player = getPlayerPtr();
|
MWWorld::Ptr player = getPlayerPtr();
|
||||||
|
|
|
@ -515,6 +515,9 @@ namespace MWWorld
|
||||||
/// @note throws an exception when invoked on a teleport door
|
/// @note throws an exception when invoked on a teleport door
|
||||||
virtual void activateDoor(const MWWorld::Ptr& door, int state);
|
virtual void activateDoor(const MWWorld::Ptr& door, int state);
|
||||||
|
|
||||||
|
// Added by tes3mp to allow saving a door state received from a packet
|
||||||
|
virtual void saveDoorState(const MWWorld::Ptr& door, int state);
|
||||||
|
|
||||||
virtual bool getPlayerStandingOn (const MWWorld::ConstPtr& object); ///< @return true if the player is standing on \a object
|
virtual bool getPlayerStandingOn (const MWWorld::ConstPtr& object); ///< @return true if the player is standing on \a object
|
||||||
virtual bool getActorStandingOn (const MWWorld::ConstPtr& object); ///< @return true if any actor is standing on \a object
|
virtual bool getActorStandingOn (const MWWorld::ConstPtr& object); ///< @return true if any actor is standing on \a object
|
||||||
virtual bool getPlayerCollidingWith(const MWWorld::ConstPtr& object); ///< @return true if the player is colliding with \a object
|
virtual bool getPlayerCollidingWith(const MWWorld::ConstPtr& object); ///< @return true if the player is colliding with \a object
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace mwmp
|
||||||
ESM::Cell cell;
|
ESM::Cell cell;
|
||||||
ESM::CellRef cellRef;
|
ESM::CellRef cellRef;
|
||||||
|
|
||||||
|
int state;
|
||||||
int lockLevel;
|
int lockLevel;
|
||||||
float scale;
|
float scale;
|
||||||
|
|
||||||
|
|
|
@ -11,4 +11,14 @@ PacketDoorActivate::PacketDoorActivate(RakNet::RakPeerInterface *peer) : WorldPa
|
||||||
void PacketDoorActivate::Packet(RakNet::BitStream *bs, WorldEvent *event, bool send)
|
void PacketDoorActivate::Packet(RakNet::BitStream *bs, WorldEvent *event, bool send)
|
||||||
{
|
{
|
||||||
WorldPacket::Packet(bs, event, send);
|
WorldPacket::Packet(bs, event, send);
|
||||||
|
|
||||||
|
RW(event->cellRef.mRefID, send);
|
||||||
|
RW(event->cellRef.mRefNum.mIndex, send);
|
||||||
|
|
||||||
|
RW(event->cell.mData.mFlags, send);
|
||||||
|
RW(event->cell.mData.mX, send);
|
||||||
|
RW(event->cell.mData.mY, send);
|
||||||
|
RW(event->cell.mName, send);
|
||||||
|
|
||||||
|
RW(event->state, send);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue