forked from teamnwah/openmw-tes3coop
Merge pull request #415 from TES3MP/0.6.3 while resolving conflicts
Conflicts: apps/openmw-mp/Script/Functions/Positions.cpp apps/openmw-mp/Script/Functions/Positions.hpp apps/openmw-mp/Script/Functions/World.cpp apps/openmw-mp/Script/Functions/World.hpp apps/openmw-mp/Script/Script.hpp apps/openmw-mp/Script/ScriptFunctions.cpp components/openmw-mp/Base/BasePlayer.hpp
This commit is contained in:
commit
4846497078
25 changed files with 241 additions and 22 deletions
|
@ -60,6 +60,17 @@ void NetActor::setRotation(float x, float z)
|
||||||
positionChanged = true;
|
positionChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetActor::setMomentum(float x, float y, float z)
|
||||||
|
{
|
||||||
|
netCreature->momentum.pos[0] = x;
|
||||||
|
netCreature->momentum.pos[1] = y;
|
||||||
|
netCreature->momentum.pos[2] = z;
|
||||||
|
|
||||||
|
if (!momentumChanged && isPlayer())
|
||||||
|
toPlayer()->addToUpdateQueue();
|
||||||
|
momentumChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
std::tuple<float, float> NetActor::getHealth() const
|
std::tuple<float, float> NetActor::getHealth() const
|
||||||
{
|
{
|
||||||
return make_tuple(netCreature->creatureStats.mDynamic[0].mBase, netCreature->creatureStats.mDynamic[0].mCurrent);
|
return make_tuple(netCreature->creatureStats.mDynamic[0].mBase, netCreature->creatureStats.mDynamic[0].mCurrent);
|
||||||
|
|
|
@ -39,6 +39,8 @@ public:
|
||||||
std::tuple<float, float> getRotation() const;
|
std::tuple<float, float> getRotation() const;
|
||||||
void setRotation(float x, float z);
|
void setRotation(float x, float z);
|
||||||
|
|
||||||
|
void setMomentum(float x, float y, float z);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return base, current
|
* @return base, current
|
||||||
|
@ -68,7 +70,7 @@ public:
|
||||||
bool isPlayer() const { return isActorPlayer; }
|
bool isPlayer() const { return isActorPlayer; }
|
||||||
Player *toPlayer();
|
Player *toPlayer();
|
||||||
protected:
|
protected:
|
||||||
bool baseInfoChanged, shapeshiftChanged, levelChanged, statsChanged, positionChanged, attributesChanged, skillsChanged;
|
bool baseInfoChanged, shapeshiftChanged, levelChanged, statsChanged, positionChanged, momentumChanged, attributesChanged, skillsChanged;
|
||||||
|
|
||||||
mwmp::BasePlayer *basePlayer;
|
mwmp::BasePlayer *basePlayer;
|
||||||
mwmp::BaseNetCreature *netCreature;
|
mwmp::BaseNetCreature *netCreature;
|
||||||
|
|
|
@ -26,8 +26,10 @@ void Object::Init(LuaState &lua)
|
||||||
"goldValue", sol::property(&Object::getGoldValue, &Object::setGoldValue),
|
"goldValue", sol::property(&Object::getGoldValue, &Object::setGoldValue),
|
||||||
"scale", sol::property(&Object::getScale, &Object::setScale),
|
"scale", sol::property(&Object::getScale, &Object::setScale),
|
||||||
"state", sol::property(&Object::getState, &Object::setState),
|
"state", sol::property(&Object::getState, &Object::setState),
|
||||||
"doorState", sol::property(&Object::getDoorState, &Object::setDoorState),
|
|
||||||
"lockLevel", sol::property(&Object::getLockLevel, &Object::setLockLevel),
|
"lockLevel", sol::property(&Object::getLockLevel, &Object::setLockLevel),
|
||||||
|
"doorState", sol::property(&Object::getDoorState, &Object::setDoorState),
|
||||||
|
"setTeleportState", &Object::setTeleportState,
|
||||||
|
"setDoorDestination", &Object::setDoorDestination,
|
||||||
"setDisarmState", &Object::setDisarmState,
|
"setDisarmState", &Object::setDisarmState,
|
||||||
"setMasterState", &Object::setMasterState
|
"setMasterState", &Object::setMasterState
|
||||||
);
|
);
|
||||||
|
@ -215,6 +217,24 @@ void Object::setLockLevel(int locklevel)
|
||||||
object.lockLevel = locklevel;
|
object.lockLevel = locklevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Object::setTeleportState(bool state)
|
||||||
|
{
|
||||||
|
changedDoorDestination = true;
|
||||||
|
object.teleportState = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::setDoorDestination(const std::string &cellDescription, float posX, float posY, float posZ, float rotX, float rotY, float rotZ)
|
||||||
|
{
|
||||||
|
changedDoorDestination = true;
|
||||||
|
object.destinationCell = Utils::getCellFromDescription(cellDescription);
|
||||||
|
object.destinationPosition.pos[0] = posX;
|
||||||
|
object.destinationPosition.pos[1] = posY;
|
||||||
|
object.destinationPosition.pos[2] = posZ;
|
||||||
|
object.destinationPosition.rot[0] = rotX;
|
||||||
|
object.destinationPosition.rot[1] = rotY;
|
||||||
|
object.destinationPosition.rot[2] = rotZ;
|
||||||
|
}
|
||||||
|
|
||||||
void Object::setDisarmState(bool state)
|
void Object::setDisarmState(bool state)
|
||||||
{
|
{
|
||||||
changedObjectTrap = true;
|
changedObjectTrap = true;
|
||||||
|
@ -344,6 +364,7 @@ void ObjectController::sendObjects(shared_ptr<Player> player, shared_ptr<vector<
|
||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
DOOR_STATE = 0,
|
DOOR_STATE = 0,
|
||||||
|
DOOR_DESTINATION,
|
||||||
OBJECT_STATE,
|
OBJECT_STATE,
|
||||||
OBJECT_SCALE,
|
OBJECT_SCALE,
|
||||||
OBJECT_TRAP,
|
OBJECT_TRAP,
|
||||||
|
@ -375,6 +396,11 @@ void ObjectController::sendObjects(shared_ptr<Player> player, shared_ptr<vector<
|
||||||
changed[Type::DOOR_STATE] = true;
|
changed[Type::DOOR_STATE] = true;
|
||||||
events[Type::DOOR_STATE].worldObjects.push_back(object->object);
|
events[Type::DOOR_STATE].worldObjects.push_back(object->object);
|
||||||
}
|
}
|
||||||
|
if (object->changedDoorDestination && validNewObjOrCopy)
|
||||||
|
{
|
||||||
|
changed[Type::DOOR_DESTINATION] = true;
|
||||||
|
events[Type::DOOR_DESTINATION].worldObjects.push_back(object->object);
|
||||||
|
}
|
||||||
if (object->changedObjectState && validNewObjOrCopy)
|
if (object->changedObjectState && validNewObjOrCopy)
|
||||||
{
|
{
|
||||||
changed[Type::OBJECT_STATE] = true;
|
changed[Type::OBJECT_STATE] = true;
|
||||||
|
@ -424,6 +450,16 @@ void ObjectController::sendObjects(shared_ptr<Player> player, shared_ptr<vector<
|
||||||
if (broadcast)
|
if (broadcast)
|
||||||
packet->Send(true);
|
packet->Send(true);
|
||||||
}
|
}
|
||||||
|
if (changed[Type::DOOR_DESTINATION])
|
||||||
|
{
|
||||||
|
auto packet = worldCtrl->GetPacket(ID_DOOR_DESTINATION);
|
||||||
|
auto &event = events[Type::DOOR_DESTINATION];
|
||||||
|
packet->setEvent(&event);
|
||||||
|
packet->Send(false);
|
||||||
|
|
||||||
|
if (broadcast)
|
||||||
|
packet->Send(true);
|
||||||
|
}
|
||||||
if (changed[Type::OBJECT_STATE])
|
if (changed[Type::OBJECT_STATE])
|
||||||
{
|
{
|
||||||
auto packet = worldCtrl->GetPacket(ID_OBJECT_STATE);
|
auto packet = worldCtrl->GetPacket(ID_OBJECT_STATE);
|
||||||
|
|
|
@ -84,10 +84,13 @@ public:
|
||||||
int getLockLevel() const;
|
int getLockLevel() const;
|
||||||
void setLockLevel(int locklevel);
|
void setLockLevel(int locklevel);
|
||||||
|
|
||||||
|
void setTeleportState(bool state);
|
||||||
|
void setDoorDestination(const std::string &cellDescription, float posX, float posY, float posZ, float rotX, float rotY, float rotZ);
|
||||||
|
|
||||||
void setDisarmState(bool state);
|
void setDisarmState(bool state);
|
||||||
void setMasterState(bool state);
|
void setMasterState(bool state);
|
||||||
|
|
||||||
bool changedDoorState, changedObjectState, changedObjectScale, changedObjectTrap, changedObjectLock,
|
bool changedDoorState, changedDoorDestination, changedObjectState, changedObjectScale, changedObjectTrap, changedObjectLock,
|
||||||
changedObjectDelete, changedObjectSpawn, changedObjectPlace;
|
changedObjectDelete, changedObjectSpawn, changedObjectPlace;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ void Player::Init(LuaState &lua)
|
||||||
"setPosition", &NetActor::setPosition,
|
"setPosition", &NetActor::setPosition,
|
||||||
"getRotation", &NetActor::getRotation,
|
"getRotation", &NetActor::getRotation,
|
||||||
"setRotation", &NetActor::setRotation,
|
"setRotation", &NetActor::setRotation,
|
||||||
|
"setMomentum", &NetActor::setMomentum,
|
||||||
|
|
||||||
"getHealth", &NetActor::getHealth,
|
"getHealth", &NetActor::getHealth,
|
||||||
"setHealth", &NetActor::setHealth,
|
"setHealth", &NetActor::setHealth,
|
||||||
|
@ -184,6 +185,13 @@ void Player::update()
|
||||||
packet->Send(false);
|
packet->Send(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (momentumChanged)
|
||||||
|
{
|
||||||
|
auto packet = plPCtrl->GetPacket(ID_PLAYER_MOMENTUM);
|
||||||
|
packet->setPlayer(basePlayer);
|
||||||
|
packet->Send(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (shapeshiftChanged)
|
if (shapeshiftChanged)
|
||||||
{
|
{
|
||||||
auto packet = plPCtrl->GetPacket(ID_PLAYER_SHAPESHIFT);
|
auto packet = plPCtrl->GetPacket(ID_PLAYER_SHAPESHIFT);
|
||||||
|
|
|
@ -124,12 +124,12 @@ add_openmw_dir (mwmp/processors/player ProcessorChatMessage ProcessorGUIMessageB
|
||||||
ProcessorPlayerSpellbook ProcessorPlayerStatsDynamic ProcessorPlayerTopic
|
ProcessorPlayerSpellbook ProcessorPlayerStatsDynamic ProcessorPlayerTopic
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwmp/processors/world BaseObjectProcessor ProcessorConsoleCommand ProcessorContainer ProcessorDoorState
|
add_openmw_dir (mwmp/processors/world BaseObjectProcessor ProcessorConsoleCommand ProcessorContainer ProcessorDoorDestination
|
||||||
ProcessorMusicPlay ProcessorVideoPlay ProcessorObjectAnimPlay ProcessorObjectAttach ProcessorObjectCollision
|
ProcessorDoorState ProcessorMusicPlay ProcessorVideoPlay ProcessorObjectAnimPlay ProcessorObjectAttach
|
||||||
ProcessorObjectDelete ProcessorObjectLock ProcessorObjectMove ProcessorObjectPlace ProcessorObjectReset
|
ProcessorObjectCollision ProcessorObjectDelete ProcessorObjectLock ProcessorObjectMove ProcessorObjectPlace
|
||||||
ProcessorObjectRotate ProcessorObjectScale ProcessorObjectSpawn ProcessorObjectState ProcessorObjectTrap
|
ProcessorObjectReset ProcessorObjectRotate ProcessorObjectScale ProcessorObjectSpawn ProcessorObjectState
|
||||||
ProcessorScriptLocalShort ProcessorScriptLocalFloat ProcessorScriptMemberShort ProcessorScriptMemberFloat
|
ProcessorObjectTrap ProcessorScriptLocalShort ProcessorScriptLocalFloat ProcessorScriptMemberShort
|
||||||
ProcessorScriptGlobalShort ProcessorScriptGlobalFloat
|
ProcessorScriptMemberFloat ProcessorScriptGlobalShort ProcessorScriptGlobalFloat
|
||||||
)
|
)
|
||||||
|
|
||||||
# Main executable
|
# Main executable
|
||||||
|
|
|
@ -290,7 +290,7 @@ void LocalPlayer::updateSkills(bool forceUpdate)
|
||||||
// Update a skill if its base value has changed at all or its progress has changed enough
|
// Update a skill if its base value has changed at all or its progress has changed enough
|
||||||
if (ptrNpcStats.getSkill(i).getBase() != npcStats.mSkills[i].mBase ||
|
if (ptrNpcStats.getSkill(i).getBase() != npcStats.mSkills[i].mBase ||
|
||||||
ptrNpcStats.getSkill(i).getModifier() != npcStats.mSkills[i].mMod ||
|
ptrNpcStats.getSkill(i).getModifier() != npcStats.mSkills[i].mMod ||
|
||||||
ptrNpcStats.getSkill(i).getProgress() != npcStats.mSkills[i].mProgress ||
|
abs(ptrNpcStats.getSkill(i).getProgress() - npcStats.mSkills[i].mProgress) > 0.75 ||
|
||||||
forceUpdate)
|
forceUpdate)
|
||||||
{
|
{
|
||||||
skillIndexChanges.push_back(i);
|
skillIndexChanges.push_back(i);
|
||||||
|
@ -1007,6 +1007,13 @@ void LocalPlayer::setPosition()
|
||||||
updateAnimFlags(true);
|
updateAnimFlags(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LocalPlayer::setMomentum()
|
||||||
|
{
|
||||||
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
MWWorld::Ptr ptrPlayer = world->getPlayerPtr();
|
||||||
|
world->setInertialForce(ptrPlayer, momentum.asVec3());
|
||||||
|
}
|
||||||
|
|
||||||
void LocalPlayer::setCell()
|
void LocalPlayer::setCell()
|
||||||
{
|
{
|
||||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
|
|
@ -54,6 +54,7 @@ namespace mwmp
|
||||||
void setBounty();
|
void setBounty();
|
||||||
void setReputation();
|
void setReputation();
|
||||||
void setPosition();
|
void setPosition();
|
||||||
|
void setMomentum();
|
||||||
void setCell();
|
void setCell();
|
||||||
void setClass();
|
void setClass();
|
||||||
void setEquipment();
|
void setEquipment();
|
||||||
|
|
|
@ -227,7 +227,6 @@ void Main::updateWorld(float dt) const
|
||||||
mNetworking->getPlayerPacket(ID_PLAYER_BASEINFO)->Send();
|
mNetworking->getPlayerPacket(ID_PLAYER_BASEINFO)->Send();
|
||||||
mNetworking->getPlayerPacket(ID_LOADED)->Send();
|
mNetworking->getPlayerPacket(ID_LOADED)->Send();
|
||||||
mLocalPlayer->updateStatsDynamic(true);
|
mLocalPlayer->updateStatsDynamic(true);
|
||||||
mLocalPlayer->sendCellStates();
|
|
||||||
get().getGUIController()->setChatVisible(true);
|
get().getGUIController()->setChatVisible(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -557,6 +557,34 @@ void WorldEvent::activateDoors(MWWorld::CellStore* cellStore)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldEvent::setDoorDestinations(MWWorld::CellStore* cellStore)
|
||||||
|
{
|
||||||
|
for (const auto &worldObject : worldObjects)
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_VERBOSE, "- cellRef: %s, %i, %i", worldObject.refId.c_str(), worldObject.refNumIndex, worldObject.mpNum);
|
||||||
|
|
||||||
|
MWWorld::Ptr ptrFound = cellStore->searchExact(worldObject.refNumIndex, worldObject.mpNum);
|
||||||
|
|
||||||
|
if (ptrFound)
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_VERBOSE, "-- Found %s, %i, %i", ptrFound.getCellRef().getRefId().c_str(),
|
||||||
|
ptrFound.getCellRef().getRefNum().mIndex, ptrFound.getCellRef().getMpNum());
|
||||||
|
|
||||||
|
ptrFound.getCellRef().setTeleport(worldObject.teleportState);
|
||||||
|
|
||||||
|
if (worldObject.teleportState)
|
||||||
|
{
|
||||||
|
ptrFound.getCellRef().setDoorDest(worldObject.destinationPosition);
|
||||||
|
|
||||||
|
if (worldObject.destinationCell.isExterior())
|
||||||
|
ptrFound.getCellRef().setDestCell("");
|
||||||
|
else
|
||||||
|
ptrFound.getCellRef().setDestCell(worldObject.destinationCell.getDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void WorldEvent::runConsoleCommands(MWWorld::CellStore* cellStore)
|
void WorldEvent::runConsoleCommands(MWWorld::CellStore* cellStore)
|
||||||
{
|
{
|
||||||
MWBase::WindowManager *windowManager = MWBase::Environment::get().getWindowManager();
|
MWBase::WindowManager *windowManager = MWBase::Environment::get().getWindowManager();
|
||||||
|
|
|
@ -34,6 +34,7 @@ namespace mwmp
|
||||||
void rotateObjects(MWWorld::CellStore* cellStore);
|
void rotateObjects(MWWorld::CellStore* cellStore);
|
||||||
void animateObjects(MWWorld::CellStore* cellStore);
|
void animateObjects(MWWorld::CellStore* cellStore);
|
||||||
void activateDoors(MWWorld::CellStore* cellStore);
|
void activateDoors(MWWorld::CellStore* cellStore);
|
||||||
|
void setDoorDestinations(MWWorld::CellStore* cellStore);
|
||||||
void runConsoleCommands(MWWorld::CellStore* cellStore);
|
void runConsoleCommands(MWWorld::CellStore* cellStore);
|
||||||
|
|
||||||
void setLocalShorts(MWWorld::CellStore* cellStore);
|
void setLocalShorts(MWWorld::CellStore* cellStore);
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace mwmp
|
||||||
if (!isRequest())
|
if (!isRequest())
|
||||||
{
|
{
|
||||||
LocalPlayer &localPlayer = static_cast<LocalPlayer&>(*player);
|
LocalPlayer &localPlayer = static_cast<LocalPlayer&>(*player);
|
||||||
//localPlayer.setMomentum();
|
localPlayer.setMomentum();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace mwmp
|
||||||
{
|
{
|
||||||
BaseObjectProcessor::Do(packet, event);
|
BaseObjectProcessor::Do(packet, event);
|
||||||
|
|
||||||
//event.setDoorDestinations(ptrCellStore);
|
event.setDoorDestinations(ptrCellStore);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "characterpreview.hpp"
|
#include "characterpreview.hpp"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include <osg/Material>
|
#include <osg/Material>
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
#include <osgUtil/IntersectionVisitor>
|
#include <osgUtil/IntersectionVisitor>
|
||||||
#include <osgUtil/LineSegmentIntersector>
|
#include <osgUtil/LineSegmentIntersector>
|
||||||
|
|
||||||
|
#include <components/fallback/fallback.hpp>
|
||||||
#include <components/sceneutil/lightmanager.hpp>
|
#include <components/sceneutil/lightmanager.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
|
@ -158,14 +160,25 @@ namespace MWRender
|
||||||
stateset->setAttributeAndModes(fog, osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE);
|
stateset->setAttributeAndModes(fog, osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE);
|
||||||
|
|
||||||
osg::ref_ptr<osg::LightModel> lightmodel = new osg::LightModel;
|
osg::ref_ptr<osg::LightModel> lightmodel = new osg::LightModel;
|
||||||
lightmodel->setAmbientIntensity(osg::Vec4(0.25, 0.25, 0.25, 1.0));
|
lightmodel->setAmbientIntensity(osg::Vec4(0.0, 0.0, 0.0, 1.0));
|
||||||
stateset->setAttributeAndModes(lightmodel, osg::StateAttribute::ON);
|
stateset->setAttributeAndModes(lightmodel, osg::StateAttribute::ON);
|
||||||
|
|
||||||
/// \todo Read the fallback values from INIImporter (Inventory:Directional*) ?
|
|
||||||
osg::ref_ptr<osg::Light> light = new osg::Light;
|
osg::ref_ptr<osg::Light> light = new osg::Light;
|
||||||
light->setPosition(osg::Vec4(-0.3,0.3,0.7, 0.0));
|
const Fallback::Map* fallback = MWBase::Environment::get().getWorld()->getFallback();
|
||||||
light->setDiffuse(osg::Vec4(1,1,1,1));
|
float diffuseR = fallback->getFallbackFloat("Inventory_DirectionalDiffuseR");
|
||||||
light->setAmbient(osg::Vec4(0,0,0,1));
|
float diffuseG = fallback->getFallbackFloat("Inventory_DirectionalDiffuseG");
|
||||||
|
float diffuseB = fallback->getFallbackFloat("Inventory_DirectionalDiffuseB");
|
||||||
|
float ambientR = fallback->getFallbackFloat("Inventory_DirectionalAmbientR");
|
||||||
|
float ambientG = fallback->getFallbackFloat("Inventory_DirectionalAmbientG");
|
||||||
|
float ambientB = fallback->getFallbackFloat("Inventory_DirectionalAmbientB");
|
||||||
|
float azimuth = osg::DegreesToRadians(180.f - fallback->getFallbackFloat("Inventory_DirectionalRotationX"));
|
||||||
|
float altitude = osg::DegreesToRadians(fallback->getFallbackFloat("Inventory_DirectionalRotationY"));
|
||||||
|
float positionX = std::cos(azimuth) * std::sin(altitude);
|
||||||
|
float positionY = std::sin(azimuth) * std::sin(altitude);
|
||||||
|
float positionZ = std::cos(altitude);
|
||||||
|
light->setPosition(osg::Vec4(positionX,positionY,positionZ, 0.0));
|
||||||
|
light->setDiffuse(osg::Vec4(diffuseR,diffuseG,diffuseB,1));
|
||||||
|
light->setAmbient(osg::Vec4(ambientR,ambientG,ambientB,1));
|
||||||
light->setSpecular(osg::Vec4(0,0,0,0));
|
light->setSpecular(osg::Vec4(0,0,0,0));
|
||||||
light->setLightNum(0);
|
light->setLightNum(0);
|
||||||
light->setConstantAttenuation(1.f);
|
light->setConstantAttenuation(1.f);
|
||||||
|
|
|
@ -56,16 +56,55 @@ namespace MWWorld
|
||||||
return mCellRef.mTeleport;
|
return mCellRef.mTeleport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Make it possible to change the teleport state from elsewhere
|
||||||
|
*/
|
||||||
|
void CellRef::setTeleport(bool teleportState)
|
||||||
|
{
|
||||||
|
mCellRef.mTeleport = teleportState;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
ESM::Position CellRef::getDoorDest() const
|
ESM::Position CellRef::getDoorDest() const
|
||||||
{
|
{
|
||||||
return mCellRef.mDoorDest;
|
return mCellRef.mDoorDest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Make it possible to change the destination position from elsewhere
|
||||||
|
*/
|
||||||
|
void CellRef::setDoorDest(const ESM::Position& position)
|
||||||
|
{
|
||||||
|
mCellRef.mDoorDest = position;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
std::string CellRef::getDestCell() const
|
std::string CellRef::getDestCell() const
|
||||||
{
|
{
|
||||||
return mCellRef.mDestCell;
|
return mCellRef.mDestCell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Make it possible to change the destination cell from elsewhere
|
||||||
|
*/
|
||||||
|
void CellRef::setDestCell(const std::string& cellDescription)
|
||||||
|
{
|
||||||
|
mCellRef.mDestCell = cellDescription;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
float CellRef::getScale() const
|
float CellRef::getScale() const
|
||||||
{
|
{
|
||||||
return mCellRef.mScale;
|
return mCellRef.mScale;
|
||||||
|
|
|
@ -58,12 +58,42 @@ namespace MWWorld
|
||||||
// if it should open through animation.
|
// if it should open through animation.
|
||||||
bool getTeleport() const;
|
bool getTeleport() const;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Make it possible to change the teleport state from elsewhere
|
||||||
|
*/
|
||||||
|
void setTeleport(bool teleportState);
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
// Teleport location for the door, if this is a teleporting door.
|
// Teleport location for the door, if this is a teleporting door.
|
||||||
ESM::Position getDoorDest() const;
|
ESM::Position getDoorDest() const;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Make it possible to change the destination position from elsewhere
|
||||||
|
*/
|
||||||
|
void setDoorDest(const ESM::Position& position);
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
// Destination cell for doors (optional)
|
// Destination cell for doors (optional)
|
||||||
std::string getDestCell() const;
|
std::string getDestCell() const;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Make it possible to change the destination cell from elsewhere
|
||||||
|
*/
|
||||||
|
void setDestCell(const std::string& cellDescription);
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
// Scale applied to mesh
|
// Scale applied to mesh
|
||||||
float getScale() const;
|
float getScale() const;
|
||||||
void setScale(float scale);
|
void setScale(float scale);
|
||||||
|
|
|
@ -101,6 +101,18 @@ namespace Nif
|
||||||
data.post(nif);
|
data.post(nif);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NiLookAtController::read(NIFStream *nif)
|
||||||
|
{
|
||||||
|
Controller::read(nif);
|
||||||
|
data.read(nif);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NiLookAtController::post(NIFFile *nif)
|
||||||
|
{
|
||||||
|
Controller::post(nif);
|
||||||
|
data.post(nif);
|
||||||
|
}
|
||||||
|
|
||||||
void NiPathController::read(NIFStream *nif)
|
void NiPathController::read(NIFStream *nif)
|
||||||
{
|
{
|
||||||
Controller::read(nif);
|
Controller::read(nif);
|
||||||
|
|
|
@ -99,6 +99,15 @@ public:
|
||||||
void post(NIFFile *nif);
|
void post(NIFFile *nif);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class NiLookAtController : public Controller
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NiKeyframeDataPtr data;
|
||||||
|
|
||||||
|
void read(NIFStream *nif);
|
||||||
|
void post(NIFFile *nif);
|
||||||
|
};
|
||||||
|
|
||||||
class NiUVController : public Controller
|
class NiUVController : public Controller
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -108,6 +108,7 @@ static std::map<std::string,RecordFactoryEntry> makeFactory()
|
||||||
newFactory.insert(makeEntry("NiSequenceStreamHelper", &construct <NiSequenceStreamHelper> , RC_NiSequenceStreamHelper ));
|
newFactory.insert(makeEntry("NiSequenceStreamHelper", &construct <NiSequenceStreamHelper> , RC_NiSequenceStreamHelper ));
|
||||||
newFactory.insert(makeEntry("NiSourceTexture", &construct <NiSourceTexture> , RC_NiSourceTexture ));
|
newFactory.insert(makeEntry("NiSourceTexture", &construct <NiSourceTexture> , RC_NiSourceTexture ));
|
||||||
newFactory.insert(makeEntry("NiSkinInstance", &construct <NiSkinInstance> , RC_NiSkinInstance ));
|
newFactory.insert(makeEntry("NiSkinInstance", &construct <NiSkinInstance> , RC_NiSkinInstance ));
|
||||||
|
newFactory.insert(makeEntry("NiLookAtController", &construct <NiLookAtController> , RC_NiLookAtController ));
|
||||||
return newFactory;
|
return newFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,8 @@ enum RecordType
|
||||||
RC_NiSourceTexture,
|
RC_NiSourceTexture,
|
||||||
RC_NiSkinInstance,
|
RC_NiSkinInstance,
|
||||||
RC_RootCollisionNode,
|
RC_RootCollisionNode,
|
||||||
RC_NiSphericalCollider
|
RC_NiSphericalCollider,
|
||||||
|
RC_NiLookAtController
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Base class for all records
|
/// Base class for all records
|
||||||
|
|
|
@ -35,10 +35,14 @@ namespace mwmp
|
||||||
ESM::Position position;
|
ESM::Position position;
|
||||||
|
|
||||||
bool objectState;
|
bool objectState;
|
||||||
int doorState;
|
|
||||||
int lockLevel;
|
int lockLevel;
|
||||||
float scale;
|
float scale;
|
||||||
|
|
||||||
|
int doorState;
|
||||||
|
bool teleportState;
|
||||||
|
ESM::Cell destinationCell;
|
||||||
|
ESM::Position destinationPosition;
|
||||||
|
|
||||||
std::string filename;
|
std::string filename;
|
||||||
bool allowSkipping;
|
bool allowSkipping;
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace mwmp
|
||||||
public:
|
public:
|
||||||
ESM::Position position;
|
ESM::Position position;
|
||||||
ESM::Position direction;
|
ESM::Position direction;
|
||||||
|
ESM::Position momentum;
|
||||||
|
|
||||||
ESM::CreatureStats creatureStats;
|
ESM::CreatureStats creatureStats;
|
||||||
ESM::Cell cell;
|
ESM::Cell cell;
|
||||||
|
|
|
@ -319,6 +319,7 @@ namespace mwmp
|
||||||
bool ignorePosPacket;
|
bool ignorePosPacket;
|
||||||
|
|
||||||
ESM::Position previousCellPosition;
|
ESM::Position previousCellPosition;
|
||||||
|
|
||||||
ESM::NPC npc;
|
ESM::NPC npc;
|
||||||
ESM::NpcStats npcStats;
|
ESM::NpcStats npcStats;
|
||||||
ESM::Creature creature;
|
ESM::Creature creature;
|
||||||
|
|
|
@ -12,5 +12,6 @@ PacketPlayerMomentum::PacketPlayerMomentum(RakNet::RakPeerInterface *peer) : Pla
|
||||||
void PacketPlayerMomentum::Packet(RakNet::BitStream *bs, bool send)
|
void PacketPlayerMomentum::Packet(RakNet::BitStream *bs, bool send)
|
||||||
{
|
{
|
||||||
PlayerPacket::Packet(bs, send);
|
PlayerPacket::Packet(bs, send);
|
||||||
// Placeholder
|
|
||||||
|
RW(player->momentum.pos, send, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,5 +12,16 @@ PacketDoorDestination::PacketDoorDestination(RakNet::RakPeerInterface *peer) : W
|
||||||
void PacketDoorDestination::Object(WorldObject &worldObject, bool send)
|
void PacketDoorDestination::Object(WorldObject &worldObject, bool send)
|
||||||
{
|
{
|
||||||
WorldPacket::Object(worldObject, send);
|
WorldPacket::Object(worldObject, send);
|
||||||
// Placeholder
|
|
||||||
|
RW(worldObject.teleportState, send);
|
||||||
|
|
||||||
|
if (worldObject.teleportState)
|
||||||
|
{
|
||||||
|
RW(worldObject.destinationCell.mData, send, 1);
|
||||||
|
RW(worldObject.destinationCell.mName, send, 1);
|
||||||
|
|
||||||
|
RW(worldObject.destinationPosition.pos, send, 1);
|
||||||
|
RW(worldObject.destinationPosition.rot[0], send, 1);
|
||||||
|
RW(worldObject.destinationPosition.rot[2], send, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue