Barriers are queried, created when colliding with creatures

This commit is contained in:
2016-04-04 02:41:14 +10:00
parent 7205d6692c
commit 8749d1fd93
7 changed files with 84 additions and 9 deletions
+7 -1
View File
@@ -722,6 +722,11 @@ void World::hCharacterCreate(CharacterPacket* const argPacket) {
creaturePacket.type = SerialPacketType::QUERY_CREATURE_EXISTS; creaturePacket.type = SerialPacketType::QUERY_CREATURE_EXISTS;
creaturePacket.roomIndex = roomIndex; creaturePacket.roomIndex = roomIndex;
network.SendTo(Channels::SERVER, &creaturePacket); network.SendTo(Channels::SERVER, &creaturePacket);
BarrierPacket barrierPacket;
barrierPacket.type = SerialPacketType::QUERY_BARRIER_EXISTS;
barrierPacket.roomIndex = roomIndex;
network.SendTo(Channels::SERVER, &barrierPacket);
} }
//debug //debug
@@ -743,9 +748,10 @@ void World::hCharacterUnload(CharacterPacket* const argPacket) {
camera.marginX = 0; camera.marginX = 0;
camera.marginY = 0; camera.marginY = 0;
//clear the room //clear/reset the room
roomIndex = -1; roomIndex = -1;
regionPager.UnloadAll(); regionPager.UnloadAll();
barrierMap.clear();
characterMap.clear(); characterMap.clear();
creatureMap.clear(); creatureMap.clear();
} }
+39
View File
@@ -0,0 +1,39 @@
/* Copyright: (c) Kayne Ruse 2013-2016
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#pragma once
#include <cmath>
//the speeds that the characters move
constexpr double CREATURE_WALKING_SPEED = 1.0;
constexpr double CREATURE_WALKING_MOD = 1.0/sqrt(2.0);
constexpr double CREATURE_WALKING_NEGATIVE_MOD = 1.0 - CREATURE_WALKING_MOD;
//the bounds for the character objects, mapped to the default sprites
constexpr int CREATURE_BOUNDS_X = 0;
constexpr int CREATURE_BOUNDS_Y = 0;
constexpr int CREATURE_BOUNDS_WIDTH = 32;
constexpr int CREATURE_BOUNDS_HEIGHT = 32;
//the character's sprite format
constexpr int CREATURE_CELLS_X = 4;
constexpr int CREATURE_CELLS_Y = 4;
+6 -1
View File
@@ -22,7 +22,12 @@
#include "character_data.hpp" #include "character_data.hpp"
CharacterData::CharacterData(): Entity("character") { CharacterData::CharacterData(): Entity("character") {
//EMPTY SetBounds({
CHARACTER_BOUNDS_X,
CHARACTER_BOUNDS_Y,
CHARACTER_BOUNDS_WIDTH,
CHARACTER_BOUNDS_HEIGHT
});
} }
int CharacterData::GetOwner() { int CharacterData::GetOwner() {
+2 -2
View File
@@ -28,7 +28,7 @@ BarrierData::BarrierData(int i):
Entity::Entity("barrier") Entity::Entity("barrier")
{ {
instanceIndex = i; instanceIndex = i;
memcpy(status, 0, sizeof(int) * 8); memset(status, 0, sizeof(int) * 8);
} }
BarrierData::~BarrierData() { BarrierData::~BarrierData() {
@@ -38,7 +38,7 @@ BarrierData::~BarrierData() {
int BarrierData::Update(lua_State* L) { int BarrierData::Update(lua_State* L) {
int ret = 0; int ret = 0;
if (scriptRef != 0) { if (scriptRef != LUA_NOREF) {
//Call the script reference //Call the script reference
lua_pushinteger(L, scriptRef); lua_pushinteger(L, scriptRef);
lua_gettable(L, LUA_REGISTRYINDEX); lua_gettable(L, LUA_REGISTRYINDEX);
+6 -1
View File
@@ -29,7 +29,12 @@ CreatureData::CreatureData(std::string _avatar, int _scriptRef):
avatar(_avatar), avatar(_avatar),
scriptRef(_scriptRef) scriptRef(_scriptRef)
{ {
//EMPTY SetBounds({
CREATURE_BOUNDS_X,
CREATURE_BOUNDS_Y,
CREATURE_BOUNDS_WIDTH,
CREATURE_BOUNDS_HEIGHT
});
} }
int CreatureData::Update(lua_State* L) { int CreatureData::Update(lua_State* L) {
+1
View File
@@ -21,6 +21,7 @@
*/ */
#pragma once #pragma once
#include "creature_defines.hpp"
#include "entity.hpp" #include "entity.hpp"
#include "lua.hpp" #include "lua.hpp"
+23 -4
View File
@@ -66,7 +66,28 @@ void RoomData::RunFrame() {
//Compare the triggers to the entities, using their real hitboxes //Compare the triggers to the entities, using their real hitboxes
triggerMgr.Compare(entityStack); triggerMgr.Compare(entityStack);
//set the creature updates //Creature/character collisions, O(m*n)
for (auto characterIt : characterList) {
BoundingBox characterBox = characterIt->GetBounds() + characterIt->GetOrigin();
for (auto creatureIt : *creatureMgr.GetContainer()) {
BoundingBox creatureBox = creatureIt.second.GetBounds() + creatureIt.second.GetOrigin();
if (characterBox.CheckOverlap(creatureBox)) {
int barrierIndex = barrierMgr.Create(-1);
BarrierData* barrierData = barrierMgr.Find(barrierIndex);
barrierData->SetRoomIndex(roomIndex);
BarrierPacket barrierPacket;
barrierPacket.type = SerialPacketType::BARRIER_CREATE;
copyBarrierToPacket(&barrierPacket, barrierData, barrierIndex);
pumpPacketProximity(reinterpret_cast<SerialPacket*>(&barrierPacket), roomIndex, characterIt->GetOrigin(), INFLUENCE_RADIUS);
}
}
}
//send the creature updates
for (auto& it : creatureList) { for (auto& it : creatureList) {
CreaturePacket packet; CreaturePacket packet;
copyCreatureToPacket(&packet, it.second, it.first); copyCreatureToPacket(&packet, it.second, it.first);
@@ -75,7 +96,7 @@ void RoomData::RunFrame() {
pumpPacketProximity(reinterpret_cast<SerialPacket*>(&packet), roomIndex, it.second->GetOrigin(), INFLUENCE_RADIUS); pumpPacketProximity(reinterpret_cast<SerialPacket*>(&packet), roomIndex, it.second->GetOrigin(), INFLUENCE_RADIUS);
} }
//send the updates //send the barrier updates
for (auto& it : barrierList) { for (auto& it : barrierList) {
BarrierPacket packet; BarrierPacket packet;
copyBarrierToPacket(&packet, it.second, it.first); copyBarrierToPacket(&packet, it.second, it.first);
@@ -83,8 +104,6 @@ void RoomData::RunFrame() {
packet.roomIndex = roomIndex; packet.roomIndex = roomIndex;
pumpPacketProximity(reinterpret_cast<SerialPacket*>(&packet), roomIndex, it.second->GetOrigin(), INFLUENCE_RADIUS); pumpPacketProximity(reinterpret_cast<SerialPacket*>(&packet), roomIndex, it.second->GetOrigin(), INFLUENCE_RADIUS);
} }
//TODO: (0) creature/character collisions
} }
std::string RoomData::SetName(std::string s) { std::string RoomData::SetName(std::string s) {