Networked Dimensions, dimension transitions, & dimension change functions!

master
Auri 2020-11-06 22:20:44 -08:00
parent eea04c091b
commit 45646b4769
13 changed files with 33 additions and 11 deletions

View File

@ -9,7 +9,6 @@
</inspection_tool>
<inspection_tool class="LongLine" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="OCDFAInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="OCInconsistentNaming" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />

View File

@ -61,7 +61,7 @@ Api::Usertype::Dimension Api::Usertype::ServerPlayer::get_dimension() {
}
void Api::Usertype::ServerPlayer::set_dimension(const std::string& identifier) {
player->setDim(player->getDim()->getWorld().getDimension(identifier));
player->setDim(player->getDim()->getWorld().getDimension(identifier), true);
}
sol::object Api::Usertype::ServerPlayer::get_hand_list(sol::this_state s) {

View File

@ -188,6 +188,7 @@ void LocalDimension::serverEntitiesInfo(Deserializer& e) {
while (!d.atEnd()) {
switch (d.readE<NetField>()) {
case NetField::DIM: activeEntity->setDim(world.getDimension(d.read<unsigned int>())); break;
case NetField::POS: activeEntity->setPos(d.read<glm::vec3>()); break;
case NetField::VEL: activeEntity->setVel(d.read<glm::vec3>()); break;
case NetField::ROT: activeEntity->setRot(d.read<glm::vec3>()); break;

View File

@ -29,7 +29,8 @@ void ServerDimension::update(double delta) {
bool clientNearby = false;
for (auto& player : static_cast<ServerWorld&>(world).getClients().players) {
if (player->getDim()->getInd() == ind) {
// TODO: Re-enable then **once** file saving is implemented.
// if (player->getDim()->getInd() == ind) {
auto clientPos = Space::MapBlock::world::fromBlock(player->getPos());
if (abs(clientPos.x - mb->pos.x) <= discardRange.x + 1
&& abs(clientPos.y - mb->pos.y) <= discardRange.y + 1
@ -37,7 +38,7 @@ void ServerDimension::update(double delta) {
clientNearby = true;
break;
}
}
// }
}
if (!clientNearby) region.second->remove(i);

View File

@ -4,10 +4,16 @@
#include <iostream>
#include "world/dim/Dimension.h"
#include "ServerLuaEntity.h"
#include "util/net/Serializer.h"
void ServerLuaEntity::setDim(DimensionPtr dim) {
Entity::setDim(dim);
dirtyFields.emplace(NetField::DIM);
}
void ServerLuaEntity::setPos(glm::vec3 position) {
Entity::setPos(position);
dirtyFields.emplace(NetField::POS);
@ -70,6 +76,7 @@ std::string ServerLuaEntity::serialize() {
Serializer s;
s.append<unsigned int>(id);
if (dirtyFields.count(NetField::DIM) || fullSend) s.appendE(NetField::DIM) .append(dim->getInd());
if (dirtyFields.count(NetField::POS) || fullSend) s.appendE(NetField::POS) .append(pos);
if (dirtyFields.count(NetField::VEL) || fullSend) s.appendE(NetField::VEL) .append(vel);
if (dirtyFields.count(NetField::SCALE) || fullSend) s.appendE(NetField::SCALE) .append(scale);

View File

@ -19,6 +19,7 @@ public:
LuaEntity(game, dim), Entity(game, dim) {
setId(id); };
virtual void setDim(DimensionPtr dim) override;
virtual void setPos(glm::vec3 position) override;
virtual void setVel(glm::vec3 vel) override;
virtual void setRot(glm::vec3 rot) override;

View File

@ -53,6 +53,7 @@ void LocalPlayer::handleAssertion(Deserializer &d) {
default: std::cout << "Invalid assertion." << std::endl; break;
case NetField::ID: setId(d.read<unsigned int>()); break;
case NetField::DIM: setDim(world.getDimension(d.read<unsigned int>())); break;
case NetField::POS: setPos(d.read<glm::vec3>()); break;
case NetField::VEL: setVel(d.read<glm::vec3>()); break;
case NetField::LOOK_YAW: setYaw(d.read<float>()); break;

View File

@ -10,11 +10,9 @@
#include "util/net/Serializer.h"
#include "world/dim/Dimension.h"
//TODO: For some reason this function being defined causes a segfault, but setPos, setVel, etc doesn't.
void Player::setDim(DimensionPtr dim, bool assert) {
Entity::setDim(dim);
// if (assert) assertField(Serializer().appendE(NetField::DIM).append(dim->getInd()).packet());
if (assert) assertField(Serializer().appendE(NetField::DIM).append(dim->getInd()).packet());
}
void Player::setPos(glm::vec3 pos, bool assert) {

View File

@ -38,6 +38,14 @@ void ServerPlayer::handleAssertion(Deserializer &d) {
}
}
void ServerPlayer::setDim(DimensionPtr dim, bool assert) {
Player::setDim(dim, assert);
// Force a generation flush.
lastPos = glm::vec3(INFINITY);
changedMapBlocks = true;
}
void ServerPlayer::setPos(glm::vec3 pos, bool assert) {
glm::vec3 lastMapBlock = Space::MapBlock::world::fromBlock(this->pos);
glm::vec3 newMapBlock = Space::MapBlock::world::fromBlock(pos);
@ -53,4 +61,4 @@ InventoryPtr ServerPlayer::getInventory() {
ENetPeer* ServerPlayer::getPeer() {
return client.peer;
}
}

View File

@ -26,6 +26,7 @@ public:
virtual void assertField(Packet packet) override;
virtual void handleAssertion(Deserializer& d) override;
virtual void setDim(DimensionPtr dim, bool assert = false) override;
virtual void setPos(glm::vec3 pos, bool assert = false) override;
virtual InventoryPtr getInventory() override;

View File

@ -7,8 +7,8 @@ zepha.register_block("@aurailus:crazyblocks:box", {
model = "base:block",
textures = {"zeus:default:oak_log_side", "zeus:default:oak_planks"},
on_interact = function(dim, pos, player)
print("Interacted with pandora's box")
player:set_dimension("zeus:world:endless_desert")
local in_desert = player:get_dimension().identifier == 'zeus:world:endless_desert'
player:set_dimension(in_desert and "zeus:world:default" or "zeus:world:endless_desert")
-- inventory.open_chest()
end
})

View File

@ -31,6 +31,6 @@ if zepha.server then
hw:add_stack({"zeus:default:dirt", 32})
-- hw:add_stack({"@aurailus:crazyblocks:stacker", 1})
-- hw:add_stack({"@aurailus:crazyblocks:inventory", 1})
hw:add_stack({"@aurailus:crazyblocks:box", 1})
hw:add_stack({"@aurailus:crazyblocks:box", 5})
end)
end

View File

@ -9,6 +9,11 @@ zepha.register_entity("zeus:default:test", {
})
self.object.anims:set_anim("walk")
self.object.anims:play()
zepha.after(function()
-- local in_desert = self.object.dimension.identifier == 'zeus:world:endless_desert'
-- player:set_dimension(in_desert and "zeus:world:default" or "zeus:world:endless_desert")
end, 2)
end,
on_update = function(self, delta)
self.object.pos = self.object.pos +