finaliisss
This commit is contained in:
+40
-7
@@ -130,6 +130,7 @@ void Engine::Initiate()
|
|||||||
Texture* blanktex = new Texture("assets/blanktexture.png");
|
Texture* blanktex = new Texture("assets/blanktexture.png");
|
||||||
Texture* magic = new Texture("assets/itsmagicbitch.jpg");
|
Texture* magic = new Texture("assets/itsmagicbitch.jpg");
|
||||||
Texture* snowflake = new Texture("assets/snowflake.png");
|
Texture* snowflake = new Texture("assets/snowflake.png");
|
||||||
|
Texture* shockwavetex = new Texture("assets/shockwave.png");
|
||||||
Texture* leontex = new Texture("assets/revolvertex.png");
|
Texture* leontex = new Texture("assets/revolvertex.png");
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@@ -191,6 +192,7 @@ void Engine::Initiate()
|
|||||||
struct RemotePlayer {
|
struct RemotePlayer {
|
||||||
Character* character = nullptr;
|
Character* character = nullptr;
|
||||||
double lastSeen = 0.0;
|
double lastSeen = 0.0;
|
||||||
|
p* body = nullptr; // host only: lets the host's cubes collide with this player
|
||||||
};
|
};
|
||||||
std::map<int, RemotePlayer> remotes;
|
std::map<int, RemotePlayer> remotes;
|
||||||
auto SpawnRemote = [&]() -> Character* {
|
auto SpawnRemote = [&]() -> Character* {
|
||||||
@@ -518,7 +520,7 @@ void Engine::Initiate()
|
|||||||
|
|
||||||
Mesh* blastMesh = CreateCubeMesh();
|
Mesh* blastMesh = CreateCubeMesh();
|
||||||
blastMesh->name = "shockblast";
|
blastMesh->name = "shockblast";
|
||||||
blastMesh->meshTexture = blanktex;
|
blastMesh->meshTexture = shockwavetex;
|
||||||
blastMesh->t.TranslateTo(hiddenPos);
|
blastMesh->t.TranslateTo(hiddenPos);
|
||||||
blastMesh->BindToRenderSystem();
|
blastMesh->BindToRenderSystem();
|
||||||
mainf->AddChild(blastMesh);
|
mainf->AddChild(blastMesh);
|
||||||
@@ -567,6 +569,15 @@ void Engine::Initiate()
|
|||||||
shockActive = false;
|
shockActive = false;
|
||||||
shockMesh->t.TranslateTo(hiddenPos);
|
shockMesh->t.TranslateTo(hiddenPos);
|
||||||
}
|
}
|
||||||
|
else if (lan && lan->IsActive()) {
|
||||||
|
// Another player's blast: launch the cubes (host: the real ones; client: its local copies)
|
||||||
|
for (p* obj : physicsengine->GetObjects()) {
|
||||||
|
bool isCube = false;
|
||||||
|
for (const HostCube& hc : hostCubes) if (obj->pointer == hc.mesh) isCube = true;
|
||||||
|
for (auto& kv : puppetCubes) if (obj->pointer == kv.second.mesh) isCube = true;
|
||||||
|
if (isCube) launch(obj->pointer->t.GetTranslation(), obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
blastMesh->t.TranslateTo(center);
|
blastMesh->t.TranslateTo(center);
|
||||||
blastMesh->t.ScaleTo(glm::vec3(0.5f));
|
blastMesh->t.ScaleTo(glm::vec3(0.5f));
|
||||||
blastTime = blastShowTime;
|
blastTime = blastShowTime;
|
||||||
@@ -1090,14 +1101,25 @@ void Engine::Initiate()
|
|||||||
m->t.ScaleTo(1.0f);
|
m->t.ScaleTo(1.0f);
|
||||||
m->BindToRenderSystem();
|
m->BindToRenderSystem();
|
||||||
mainf->AddChild(m);
|
mainf->AddChild(m);
|
||||||
// Solid for the local player, but moved only by the host's stream (like the floor, never simulated here)
|
// Simulated locally exactly like the host's cubes (so the local player pushes them with
|
||||||
p* cubeBody = new p(m);
|
// no lag); the host's stream below only corrects drift.
|
||||||
cubeBody->velocity = false;
|
physicsengine->AddObject(new p(m));
|
||||||
physicsengine->AddObject(cubeBody);
|
m->t.TranslateTo(nc.position);
|
||||||
|
m->t.RotateToQuaternion(nc.rotation);
|
||||||
it = puppetCubes.emplace(nc.id, PuppetCube{ m, now }).first;
|
it = puppetCubes.emplace(nc.id, PuppetCube{ m, now }).first;
|
||||||
}
|
}
|
||||||
it->second.mesh->t.TranslateTo(nc.position);
|
else {
|
||||||
it->second.mesh->t.RotateToQuaternion(nc.rotation);
|
t& ct = it->second.mesh->t;
|
||||||
|
const glm::vec3 err = nc.position - ct.GetTranslation();
|
||||||
|
if (glm::length(err) > 3.0f) {
|
||||||
|
ct.TranslateTo(nc.position);
|
||||||
|
ct.RotateToQuaternion(nc.rotation);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ct.TranslateBy(err * 0.35f);
|
||||||
|
ct.RotateToQuaternion(glm::slerp(ct.GetRotationQuaternion(), nc.rotation, 0.35f));
|
||||||
|
}
|
||||||
|
}
|
||||||
it->second.lastSeen = now;
|
it->second.lastSeen = now;
|
||||||
}
|
}
|
||||||
for (auto it = puppetCubes.begin(); it != puppetCubes.end();) {
|
for (auto it = puppetCubes.begin(); it != puppetCubes.end();) {
|
||||||
@@ -1128,12 +1150,22 @@ void Engine::Initiate()
|
|||||||
rp.character = SpawnRemote();
|
rp.character = SpawnRemote();
|
||||||
rp.character->body->t.TranslateTo(u.state.position);
|
rp.character->body->t.TranslateTo(u.state.position);
|
||||||
rp.character->body->t.RotateToQuaternion(u.state.rotation);
|
rp.character->body->t.RotateToQuaternion(u.state.rotation);
|
||||||
|
if (lan->GetMode() == Lan::Mode::Host) {
|
||||||
|
// Solid for the host's cubes (kinematic: moved by the client's stream only)
|
||||||
|
rp.body = new p(rp.character->body);
|
||||||
|
rp.body->velocity = false;
|
||||||
|
physicsengine->AddObject(rp.body);
|
||||||
|
}
|
||||||
it = remotes.emplace(u.id, rp).first;
|
it = remotes.emplace(u.id, rp).first;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Smooth over the 60 Hz updates
|
// Smooth over the 60 Hz updates
|
||||||
t& rt = it->second.character->body->t;
|
t& rt = it->second.character->body->t;
|
||||||
|
const glm::vec3 before = rt.GetTranslation();
|
||||||
rt.TranslateTo(glm::mix(rt.GetTranslation(), u.state.position, 0.5f));
|
rt.TranslateTo(glm::mix(rt.GetTranslation(), u.state.position, 0.5f));
|
||||||
|
// Kinematic body: its velocity makes it push cubes like the client's own body does there
|
||||||
|
if (it->second.body && deltatime > 0.0f)
|
||||||
|
it->second.body->linearvelocity = (rt.GetTranslation() - before) / deltatime;
|
||||||
rt.RotateToQuaternion(glm::slerp(rt.GetRotationQuaternion(), u.state.rotation, 0.5f));
|
rt.RotateToQuaternion(glm::slerp(rt.GetRotationQuaternion(), u.state.rotation, 0.5f));
|
||||||
}
|
}
|
||||||
it->second.lastSeen = now;
|
it->second.lastSeen = now;
|
||||||
@@ -1143,6 +1175,7 @@ void Engine::Initiate()
|
|||||||
for (auto it = remotes.begin(); it != remotes.end();) {
|
for (auto it = remotes.begin(); it != remotes.end();) {
|
||||||
if (now - it->second.lastSeen > 2.0) {
|
if (now - it->second.lastSeen > 2.0) {
|
||||||
rendersystem->RemoveRenderable(it->second.character);
|
rendersystem->RemoveRenderable(it->second.character);
|
||||||
|
if (it->second.body) physicsengine->RemoveObject(it->second.character->body);
|
||||||
delete it->second.character;
|
delete it->second.character;
|
||||||
it = remotes.erase(it);
|
it = remotes.erase(it);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user