diff --git a/OpenGTA-win/OpenGTA-win.vcxproj b/OpenGTA-win/OpenGTA-win.vcxproj index 17c356d..2f67251 100755 --- a/OpenGTA-win/OpenGTA-win.vcxproj +++ b/OpenGTA-win/OpenGTA-win.vcxproj @@ -169,6 +169,7 @@ + @@ -239,6 +240,7 @@ + diff --git a/OpenGTA-win/OpenGTA-win.vcxproj.filters b/OpenGTA-win/OpenGTA-win.vcxproj.filters index 6e18958..18f5423 100755 --- a/OpenGTA-win/OpenGTA-win.vcxproj.filters +++ b/OpenGTA-win/OpenGTA-win.vcxproj.filters @@ -28,6 +28,9 @@ {b411155d-6ed1-42eb-b97b-2236cdffc485} + + {d3f70488-602d-4579-81fd-180426fd4fad} + @@ -207,6 +210,9 @@ Source Files + + Source Files\net + @@ -407,6 +413,9 @@ Source Files + + Source Files\net + diff --git a/ai.cpp b/ai.cpp index 8d8447a..c962eb5 100755 --- a/ai.cpp +++ b/ai.cpp @@ -13,22 +13,23 @@ namespace OpenGTA { namespace Pedestrian { void walk_pavement(OpenGTA::Pedestrian* ped) { assert(ped); - Util::CellIterator ci(ped->pos); + Util::CellIterator ci(ped->pos()); if (!ci.isValid()) return; OpenGTA::Map::BlockInfo & bi = ci.getBlock(); //INFO << " ped in bt: " << int(bi.blockType()) << std::endl; //INFO << ped->pos.x << " " << ped->pos.z << std::endl; - std::pair f = ci.findNeighbourWithType(3, ped->rot); + std::pair f = ci.findNeighbourWithType(3, ped->rot()); if (f.first) { //INFO << "next: " << f.second.x << " " << f.second.y << std::endl; - ped->aiData.pos1 = Vector3D(f.second.x+0.5f, ped->pos.y, f.second.y+0.5f); + ped->aiData.pos1 = Vector3D(f.second.x+0.5f, ped->pos().y, f.second.y+0.5f); ped->aiMode = 1; } } void moveto_shortrange(OpenGTA::Pedestrian *ped) { - assert(ped); + + /* assert(ped); float d = Util::distance(ped->pos, ped->aiData.pos1); //INFO << "dist: " << d << std::endl; float a = Util::xz_turn_angle(ped->pos, ped->aiData.pos1); @@ -64,7 +65,7 @@ namespace OpenGTA { { OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).getInCar(); } - } + }*/ } } diff --git a/entity_controller.cpp b/entity_controller.cpp old mode 100644 new mode 100755 index ab2e97b..e1c2253 --- a/entity_controller.cpp +++ b/entity_controller.cpp @@ -20,11 +20,451 @@ * 3. This notice may not be removed or altered from any source * * distribution. * ************************************************************************/ + +#define _USE_MATH_DEFINES +#include + #include "entity_controller.h" #include "log.h" #include "m_exceptions.h" +#include "opengta.h" +#include "dataholder.h" + + +float slope_height_offset(unsigned char slope_type, float dx, float dz); + namespace OpenGTA { + + float heightOverTerrain(Eigen::Vector3f v) { + float x, y, z; + x = floor(v.x()); + y = floor(v.y()); + z = floor(v.z()); + PHYSFS_uint8 x_b, z_b; + x_b = (PHYSFS_uint8)x; + z_b = (PHYSFS_uint8)z; + if (y < 0.0f) { + //ERROR << "Below level! at coords: " << v.x << ", " << v.y << ", " << v.z << std::endl; + return 1.0f; + } + if (x < 0 || x > 255 || z < 0 || z > 255) { + //ERROR << "x = " << x << "(" << v.x << ") z = " << z << " (" << v.z << ")" << std::endl; + throw E_OUTOFRANGE("invalid x/z pos"); + } + if (y > 20) { + INFO << y << " seems a bit high; going to 20" << std::endl; + INFO << x << " " << z << std::endl; + y = 20; + } + OpenGTA::Map & map = OpenGTA::MapHolder::Instance().get(); + while (y >= map.getNumBlocksAtNew(x_b, z_b) && y > 0.0f) + y -= 1.0f; + while (y < map.getNumBlocksAtNew(x_b, z_b) && y > 0.0f) { + OpenGTA::Map::BlockInfo * block = map.getBlockAtNew(x_b, z_b, (PHYSFS_uint8)y); + assert(block); + if (block->blockType() > 0) { + float bz = slope_height_offset(block->slopeType(), v.x() - x, v.z() - z); + if (block->slopeType() == 0 && (block->blockType() != 5 && + block->blockType() != 6)) + bz -= 1.0f; + //INFO << "hit " << int(block->blockType()) << " at " << int(y) << std::endl; + return v.y() - (y + bz); + } + y -= 1.0f; + } + y = floor(v.y()) + 1.0f; + while (y < map.getNumBlocksAtNew(x_b, z_b) && y > 0.0f) { + OpenGTA::Map::BlockInfo * block = map.getBlockAtNew(x_b, z_b, (PHYSFS_uint8)y); + assert(block); + if (block->blockType() > 0) { + float bz = slope_height_offset(block->slopeType(), v.x() - x, v.z() - z); + if (block->slopeType() == 0 && (block->blockType() != 5 + && block->blockType() != 6)) + bz -= 1.0f; + //INFO << "hit " << int(block->blockType()) << " at " << int(y) << std::endl; + return v.y() - (y + bz); + } + y += 1.0f; + } + INFO << "should this be reached?" << std::endl; + return 1.0f; + } + + + PlayerPedController::PlayerPedController() + { + pos = Eigen::Vector3f{ 12.0f, 6.1f, 12.0f }; + } + + void PlayerPedController::setMoveForward() + { + pressedButtons = pressedButtons | 0b00000001; + } + + + void PlayerPedController::setMoveBack() + { + pressedButtons = pressedButtons | 0b00000010; + } + + void PlayerPedController::setTurnLeft() + { + pressedButtons = pressedButtons | 0b00000100; + } + + void PlayerPedController::setTurnRight() + { + pressedButtons = pressedButtons | 0b00001000; + } + + + + void PlayerPedController::releaseMoveForward() + { + pressedButtons = pressedButtons & 0b11111110; + } + + + + + void PlayerPedController::releaseMoveBack() + { + pressedButtons = pressedButtons & 0b11111101; + } + + void PlayerPedController::releaseTurnLeft() + { + pressedButtons = pressedButtons & 0b1111011; + } + + + void PlayerPedController::releaseTurnRight() + { + pressedButtons = pressedButtons & 0b11110111; + } + + + bool PlayerPedController::isMoveForward() + { + return (pressedButtons & 0b00000001) > 0; + } + bool PlayerPedController::isMoveBack() + { + return (pressedButtons & 0b00000010) > 0; + } + bool PlayerPedController::isTurnLeft() + { + return (pressedButtons & 0b00000100) > 0; + } + bool PlayerPedController::isTurnRight() + { + return (pressedButtons & 0b00001000) > 0; + } + + + int PlayerPedController::getMove() + { + if (isMoveForward() && isMoveBack()) + { + return 0; + } + else if (isMoveForward()) + { + return 1; + } + else if (isMoveBack()) + { + return -1; + } + else + { + return 0; + } + } + bool PlayerPedController::getRunning() + { + return 1; + } + + int PlayerPedController::getTurn() + { + + if (isTurnLeft() && isTurnRight()) + { + return 0; + } + else if (isTurnLeft()) + { + return 1; + } + else if (isTurnRight()) + { + return -1; + } + else + { + return 0; + } + } + + + void PlayerPedController::updatePos(uint32_t delta) + { + + static const float CONST_ROTATE_VELOCITY = 0.2f; + static const float CONST_MOVE_VELOCITY = 0.001f; + + Eigen::Vector3f moveDelta{ 0, 0, 0 }; + + + switch (getTurn()) { + case -1: + rot -= CONST_ROTATE_VELOCITY * delta; + break; + case 1: + rot += CONST_ROTATE_VELOCITY * delta; + break; + case 0: + break; + } + if (rot >= 360.0f) + { + rot -= 360.0f; + } + if (rot < 0.0f) + { + rot += 360.0f; + } + + + switch (getMove()) { + case -1: + moveDelta(0) -= sin(rot * M_PI / 180.0f) * CONST_MOVE_VELOCITY * delta; + moveDelta(2) -= cos(rot * M_PI / 180.0f) * CONST_MOVE_VELOCITY * delta; + break; + case 1: + moveDelta(0) += sin(rot * M_PI / 180.0f) * CONST_MOVE_VELOCITY * delta; + moveDelta(2) += cos(rot * M_PI / 180.0f) * CONST_MOVE_VELOCITY * delta; + break; + case 2: + moveDelta(0) += sin(rot * M_PI / 180.0f) * CONST_MOVE_VELOCITY * delta; + moveDelta(2) += cos(rot * M_PI / 180.0f) * CONST_MOVE_VELOCITY * delta; + break; + case 0: + break; + } + + auto newPos = pos + moveDelta; + + int inGroundContact = checkInGroundContact(newPos); + if (inGroundContact) + { + tryMove(newPos); + } + + if (!inGroundContact) { + speedForces(1) += 0.0005f *delta; + pos(1) -= speedForces(1); + if (speedForces(1) < 0.2f) + { + INFO << "bridge step? height: " << pos.y() << " speed: " << speedForces.y() << std::endl; + } + else + { + INFO << "FALLING " << pos.y() << " speed " << speedForces.y() << std::endl; + } + } + else { + if (speedForces(1) > 0.1) + { + INFO << "impacting with speed: " << speedForces.y() << std::endl; + } + speedForces(1) = 0.0f; + } + } + + int PlayerPedController::checkInGroundContact(Eigen::Vector3f nPos) + { + int inGroundContact; + + float hot = heightOverTerrain(nPos); + if (hot > 0.3f) + inGroundContact = 0; + else if (hot < 0.0) { + WARN << "gone below: " << hot << " at " << nPos.x() << ", " << nPos.y() << ", " << nPos.z() << std::endl; + nPos(1) -= (hot - 0.3f); + //nPos.y += 1; + //INFO << nPos.y << std::endl; + inGroundContact = 1; + } + else { + inGroundContact = 1; + nPos(1) -= hot - 0.1f; + } + + return inGroundContact; + } + + void PlayerPedController::tryMove(Eigen::Vector3f nPos) { + float x, y, z; + x = floor(nPos.x()); + y = floor(nPos.y()); + z = floor(nPos.z()); + + + OpenGTA::Map & map = OpenGTA::MapHolder::Instance().get(); + OpenGTA::GraphicsBase & graphics = OpenGTA::StyleHolder::Instance().get(); + + + + if (y < map.getNumBlocksAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z)) && y > 0.0f) { + OpenGTA::Map::BlockInfo * block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z), PHYSFS_uint8(y)); + assert(block); + if (block->left && graphics.isBlockingSide(block->left)) { + if (block->isFlat()) { + if (x - pos.x() < 0 && x - pos.x() > -0.2f) { + nPos(0) = (nPos.x() < pos.x()) ? pos.x() : nPos.x(); + } + else if (x - pos.x() > 0 && x - pos.x() < 0.2f) + nPos(0) = pos.x(); + } + else { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "xblock left: " << x - pos.x() << " tex: " << int(block->left) << std::endl; +#endif + if (x - pos.x() > 0 && x - pos.x() < 0.2f) + nPos(0) = pos.x(); + else if (x - pos.x() < 0 && x - pos.x() > -0.2f) + nPos(0) = (nPos.x() < pos.x()) ? pos.x() : nPos.x(); + } + } + if (block->right && block->isFlat() == false) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "xblock right: " << pos.x() - x - 1 << " tex: " << int(block->right) << std::endl; +#endif + if (pos.x() - x - 1 > 0 && pos.x() - x - 1 < 0.2f) { + nPos(0) = pos.x(); + } + else if (pos.x() - x - 1 < 0 && pos.x() - x - 1 > -0.2f) + nPos(0) = (nPos.x() > pos.x()) ? pos.x() : nPos.x(); + } + if (block->top && graphics.isBlockingSide(block->top)) { + if (block->isFlat()) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "zblock top: " << z - pos.z() << " tex: " << int(block->top) << std::endl; +#endif + if (z - pos.z() > 0 && z - pos.z() < 0.2f) + nPos(2) = pos.z(); + else if (z - pos.z() < 0 && z - pos.z() > -0.2f) + nPos(2) = (nPos.z() < pos.z()) ? pos.z() : nPos.z(); + } + else { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "zblock top: " << z - pos.z() << " tex: " << int(block->top) << std::endl; +#endif + if (z - pos.z() > 0 && z - pos.z() < 0.2f) + nPos(2) = pos.z(); + else if (z - pos.z() < 0 && z - pos.z() > -0.2f) + nPos(2) = (nPos.z() < pos.z()) ? pos.z() : nPos.z(); + } + } + if (block->bottom && block->isFlat() == false) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "zblock bottom: " << pos.z() - z - 1 << " tex: " << int(block->bottom) << std::endl; +#endif + if (pos.z() - z - 1 > 0 && pos.z() - z - 1 < 0.2f) { + nPos(2) = pos.z(); + } + else if (pos.z() - z - 1 < 0 && pos.z() - z - 1 > -0.2f) + nPos(2) = (nPos.z() > pos.z()) ? pos.z() : nPos.z(); + } + if (x >= 1 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x - 1), PHYSFS_uint8(z))) { + block = map.getBlockAtNew(PHYSFS_uint8(x - 1), PHYSFS_uint8(z), PHYSFS_uint8(y)); + if (block->right && block->isFlat() == false) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "xblock right: " << pos.x() - x << " tex: " << int(block->right) << std::endl; +#endif + if (pos.x() - x < 0.2f) { + nPos(0) = (nPos.x() < pos.x() ? pos.x() : nPos.x()); + } + } + } + if (x < 255 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x + 1), PHYSFS_uint8(z))) { + block = map.getBlockAtNew(PHYSFS_uint8(x + 1), PHYSFS_uint8(z), PHYSFS_uint8(y)); + if (block->left && graphics.isBlockingSide(block->left)) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "xblock left: " << x + 1 - pos.x() << " tex: " << int(block->left) << std::endl; +#endif + if (block->isFlat()) { + if (x + 1 - pos.x() > 0 && x + 1 - pos.x() < 0.2f) + nPos(0) = (nPos.x() < pos.x() ? nPos.x() : pos.x()); + } + else { + if (x + 1 - pos.x() < 0.2f) + nPos(0) = (nPos.x() < pos.x() ? nPos.x() : pos.x()); + } + } + } + if (z >= 1 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z - 1))) { + block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z - 1), PHYSFS_uint8(y)); + if (block->bottom && block->isFlat() == false) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "zblock bottom: " << pos.z() - z << " tex: " << int(block->bottom) << std::endl; +#endif + if (pos.z() - z < 0.2f) { + nPos(2) = (nPos.z() < pos.z() ? pos.z() : nPos.z()); + } + } + } + if (z < 255 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z + 1))) { + block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z + 1), PHYSFS_uint8(y)); + if (block->top && graphics.isBlockingSide(block->top)) { +#ifdef DEBUG_OLD_PED_BLOCK + INFO << "zblock top: " << z + 1 - pos.z() << " tex: " << int(block->top) << std::endl; +#endif + if (block->isFlat()) { + if (z + 1 - pos.z() > 0 && z + 1 - pos.z() < 0.2f) + nPos(2) = (nPos.z() < pos.z() ? nPos.z() : pos.z()); + } + else { + if (z + 1 - pos.z() < 0.2f) + nPos(2) = (nPos.z() < pos.z() ? nPos.z() : pos.z()); + } + } + } + //if (inGroundContact) + // pos = nPos; + } + + + bool obj_blocked = false; + + /* + std::list & list = SpriteManagerHolder::Instance().getList(); + for (std::list::iterator i = list.begin(); i != list.end(); i++) { + if (isBoxInBox(*i)) { + if (Util::distance(pos(), i->pos()) > Util::distance(nPos, i->pos())) + obj_blocked = true; + } + }*/ + + if (obj_blocked == false) + { + pos = nPos; + } + + } + + + + + + + + + + EntityController::EntityController() : rawData(0), dataSet(sizeof(rawData) * 8, (unsigned char*)&rawData) {} diff --git a/entity_controller.h b/entity_controller.h old mode 100644 new mode 100755 index d61a753..e205493 --- a/entity_controller.h +++ b/entity_controller.h @@ -25,8 +25,81 @@ #include #include "set.h" +#include namespace OpenGTA { + + + class PositionController { + public: + Eigen::Vector3f pos{ 0.f, 0.f, 0.f }; + + float rot = 0; + + virtual ~PositionController() {} + + virtual int getMove() + { + return 0; + } + + virtual bool getRunning() + { + return false; + } + + virtual int getTurn() + { + return 0; + } + + virtual void updatePos(uint32_t delta) + { + + } + + }; + + class PlayerPedController : public PositionController { + public: + + uint8_t pressedButtons = 0; + + + Eigen::Vector3f speedForces{ 0.f, 0.f, 0.f }; //only local, not from server + + PlayerPedController(); + + void setMoveForward(); + void setMoveBack(); + void setTurnLeft(); + void setTurnRight(); + + void releaseMoveForward(); + void releaseMoveBack(); + void releaseTurnLeft(); + void releaseTurnRight(); + + bool isMoveForward(); + bool isMoveBack(); + bool isTurnLeft(); + bool isTurnRight(); + + virtual int getMove(); + virtual bool getRunning(); + virtual int getTurn(); + + virtual void updatePos(uint32_t delta); + int checkInGroundContact(Eigen::Vector3f nPos); + void tryMove(Eigen::Vector3f nPos); + + }; + + + + + + class EntityController { public: EntityController(); diff --git a/game_objects.cpp b/game_objects.cpp index 63e3f16..a8f173a 100755 --- a/game_objects.cpp +++ b/game_objects.cpp @@ -32,6 +32,7 @@ #include "log.h" #include "gl_camera.h" +#include "net/udp_client.h" #define INT2FLOAT_WRLD(c) (float(c >> 6) + float(c % 64) / 64.0f) #define INT2F_DIV64(v) (float(v) / 64.0f) @@ -142,16 +143,17 @@ namespace OpenGTA { uint32_t Pedestrian::fistAmmo = 0; - Pedestrian::Pedestrian(Vector3D e, const Vector3D & p, uint32_t id, Sint16 remapId) : - GameObject_common(p), + Pedestrian::Pedestrian(Vector3D e, const Vector3D & p, uint32_t id, Sint16 remapId, PlayerPedController& newPlayerController) : + GameObject_common(newPlayerController), Sprite(0, remapId, GraphicsBase::SpriteNumbers::PED), OBox(TranslateMatrix3D(p), e * 0.5f), - m_control(), + playerController(newPlayerController), speedForces(0, 0, 0), inventory(), activeWeapon(0), activeAmmo(&fistAmmo), - aiData() { + aiData() + { m_M = TranslateMatrix3D(p); - m_M.RotZ(-rot); + m_M.RotZ(-rot()); pedId = id; animId = 0; isDead = 0; @@ -161,9 +163,8 @@ namespace OpenGTA { Pedestrian::Pedestrian(const Pedestrian & other) : GameObject_common(other), Sprite(other), OBox(other), - pedId(other.pedId), - m_control(), + playerController(other.playerController), speedForces(other.speedForces), inventory(other.inventory), activeWeapon(other.activeWeapon), @@ -174,11 +175,10 @@ namespace OpenGTA { inGroundContact = other.inGroundContact; animId = other.animId; isDead = other.isDead; - m_M = TranslateMatrix3D(other.pos); - m_M.RotZ(-other.rot); + m_M = TranslateMatrix3D(other.pos()); + m_M.RotZ(-other.rot()); } - extern void ai_step_fake(Pedestrian*); void Pedestrian::update(Uint32 ticks) { if (isDead) { anim.update(ticks); @@ -187,12 +187,17 @@ namespace OpenGTA { } - if (pedId < 0xffffffff) - ai_step_fake(this); + //if (pedId < 0xffffffff) + //ai_step_fake(this); + + + //AI::Pedestrian::walk_pavement(this); //Xperimental -- Vladislav Khorev vladislav.khorev@fishrungames.com + + /* if (aiMode) { AI::Pedestrian::moveto_shortrange(this); } @@ -209,11 +214,12 @@ namespace OpenGTA { activeAmmo = &i->second; } } - } -activeWeapon = chooseWeapon; - switch(m_control.getMove()) { + }*/ + +activeWeapon = 0; + switch(playerController.getMove()) { case 1: - if (m_control.getRunning()) { + if (playerController.getRunning()) { if (!(animId == 3u + activeWeapon*3)) switchToAnim(3 + activeWeapon*3); } @@ -240,228 +246,23 @@ activeWeapon = chooseWeapon; } anim.update(ticks); Uint32 delta = ticks - lastUpdateAt; - //INFO << "delta = " << delta << " t: " << ticks << " lt: " << lastUpdateAt << std::endl; - moveDelta = Vector3D(0, 0, 0); - switch(m_control.getTurn()) { - case -1: - rot -= 0.2f * delta; - //INFO << "rot: "<< rot << std::endl; - break; - case 1: - rot += 0.2f * delta; - //INFO << "rot: "<< rot << std::endl; - break; - case 0: - break; - } - if (rot >= 360.0f) - rot -= 360.0f; - if (rot < 0.0f) - rot += 360.0f; - switch(m_control.getMove()) { - case -1: - moveDelta.x -= sin(rot * M_PI / 180.0f) * anim.moveSpeed * delta; - moveDelta.z -= cos(rot * M_PI / 180.0f) * anim.moveSpeed * delta; - break; - case 1: - moveDelta.x += sin(rot * M_PI / 180.0f) * anim.moveSpeed * delta; - moveDelta.z += cos(rot * M_PI / 180.0f) * anim.moveSpeed * delta; - break; - case 2: - moveDelta.x += sin(rot * M_PI / 180.0f) * anim.moveSpeed * delta; - moveDelta.z += cos(rot * M_PI / 180.0f) * anim.moveSpeed * delta; - break; - case 0: - break; - } - if (pedId == 0xffffffff) { - } - tryMove(pos + moveDelta); - if (!inGroundContact) { - speedForces.y += 0.0005f *delta; - pos.y -= speedForces.y; - if (speedForces.y < 0.2f) - INFO << "bridge step? height: " << pos.y << " speed: " << speedForces.y << std::endl; - else - INFO << "FALLING " << pos.y << " speed " << speedForces.y << std::endl; - } - else { - if (speedForces.y > 0.1) - INFO << "impacting with speed: " << speedForces.y << std::endl; - speedForces.y = 0.0f; - } - m_M = TranslateMatrix3D(pos); - m_M.RotZ(rot); - if (m_control.getFireWeapon() && ticks - lastWeaponTick > 400) { + + playerController.updatePos(delta); + + m_M = TranslateMatrix3D(pos()); + m_M.RotZ(rot()); + /*if (m_control.getFireWeapon() && ticks - lastWeaponTick > 400) { Vector3D d1( //Vector3D(-cos(rot * M_PI/180.0f), 0, sin(rot * M_PI/180.0f)).Normalized() * 0.05f Vector3D(sin(rot * M_PI/180.0f), 0, cos(rot * M_PI/180.0f)).Normalized() * 0.01f ); SpriteManagerHolder::Instance().createProjectile(0, rot, pos, d1, ticks, pedId); lastWeaponTick = ticks; - } + }*/ - //INFO << pos.x << " " << pos.y << " " << pos.z << std::endl; lastUpdateAt = ticks; } - void Pedestrian::tryMove(Vector3D nPos) { - float x, y, z; - x = floor(nPos.x); - y = floor(nPos.y); - z = floor(nPos.z); - OpenGTA::Map & map = OpenGTA::MapHolder::Instance().get(); - OpenGTA::GraphicsBase & graphics = OpenGTA::StyleHolder::Instance().get(); - //INFO << heightOverTerrain(nPos) << std::endl; - float hot = heightOverTerrain(nPos); - if (hot > 0.3f) - inGroundContact = 0; - else if (hot < 0.0) { - WARN << "gone below: " << hot << " at " << nPos.x << ", " << nPos.y << ", " << nPos.z << std::endl; - nPos.y -= (hot - 0.3f); - //nPos.y += 1; - //INFO << nPos.y << std::endl; - inGroundContact = 1; - } - else { - inGroundContact = 1; - if (isDead) - nPos.y -= hot - 0.05f; - else - nPos.y -= hot - 0.1f; - } - if (y < map.getNumBlocksAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z)) && y > 0.0f) { - OpenGTA::Map::BlockInfo * block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z), PHYSFS_uint8(y)); - assert(block); - if (block->left && graphics.isBlockingSide(block->left)) { - if (block->isFlat()) { - if (x - pos.x < 0 && x - pos.x > -0.2f) { - nPos.x = (nPos.x < pos.x) ? pos.x : nPos.x; - } - else if (x - pos.x > 0 && x - pos.x < 0.2f) - nPos.x = pos.x; - } - else { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock left: " << x - pos.x << " tex: " << int(block->left) << std::endl; -#endif - if (x - pos.x > 0 && x - pos.x < 0.2f) - nPos.x = pos.x; - else if (x - pos.x < 0 && x - pos.x > -0.2f) - nPos.x = (nPos.x < pos.x) ? pos.x : nPos.x; - } - } - if (block->right && block->isFlat() == false) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock right: " << pos.x - x - 1 << " tex: " << int(block->right) << std::endl; -#endif - if (pos.x - x - 1 > 0 && pos.x - x - 1 < 0.2f) { - nPos.x = pos.x; - } - else if (pos.x - x - 1 < 0 && pos.x - x - 1 > -0.2f) - nPos.x = (nPos.x > pos.x) ? pos.x : nPos.x; - } - if (block->top && graphics.isBlockingSide(block->top)) { - if (block->isFlat()) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock top: " << z - pos.z << " tex: " << int(block->top) << std::endl; -#endif - if (z - pos.z > 0 && z - pos.z < 0.2f) - nPos.z = pos.z; - else if (z - pos.z < 0 && z - pos.z > -0.2f) - nPos.z = (nPos.z < pos.z) ? pos.z : nPos.z; - } - else { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock top: " << z - pos.z << " tex: " << int(block->top)<< std::endl; -#endif - if (z - pos.z > 0 && z - pos.z < 0.2f) - nPos.z = pos.z; - else if (z - pos.z < 0 && z - pos.z > -0.2f) - nPos.z = (nPos.z < pos.z) ? pos.z : nPos.z; - } - } - if (block->bottom && block->isFlat() == false) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock bottom: " << pos.z - z - 1<< " tex: " << int(block->bottom)<< std::endl; -#endif - if (pos.z - z - 1 > 0 && pos.z - z - 1 < 0.2f) { - nPos.z = pos.z; - } - else if (pos.z - z - 1 < 0 && pos.z - z - 1 > -0.2f) - nPos.z = (nPos.z > pos.z) ? pos.z : nPos.z; - } - if (x >= 1 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x-1), PHYSFS_uint8(z))) { - block = map.getBlockAtNew(PHYSFS_uint8(x-1), PHYSFS_uint8(z), PHYSFS_uint8(y)); - if (block->right && block->isFlat() == false) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock right: " << pos.x - x << " tex: " << int(block->right)<< std::endl; -#endif - if (pos.x - x < 0.2f) { - nPos.x = (nPos.x < pos.x ? pos.x : nPos.x); - } - } - } - if (x < 255 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x+1), PHYSFS_uint8(z))) { - block = map.getBlockAtNew(PHYSFS_uint8(x+1), PHYSFS_uint8(z), PHYSFS_uint8(y)); - if (block->left && graphics.isBlockingSide(block->left)) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock left: " << x + 1 - pos.x << " tex: " << int(block->left)<< std::endl; -#endif - if (block->isFlat()) { - if (x + 1 - pos.x > 0 && x + 1 - pos.x < 0.2f) - nPos.x = (nPos.x < pos.x ? nPos.x : pos.x); - } - else { - if (x + 1 - pos.x < 0.2f) - nPos.x = (nPos.x < pos.x ? nPos.x : pos.x); - } - } - } - if (z >= 1 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z-1))) { - block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z-1), PHYSFS_uint8(y)); - if (block->bottom && block->isFlat() == false) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock bottom: " << pos.z - z<< " tex: " << int(block->bottom)<< std::endl; -#endif - if (pos.z - z < 0.2f) { - nPos.z = (nPos.z < pos.z ? pos.z : nPos.z); - } - } - } - if (z < 255 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z+1))) { - block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z+1), PHYSFS_uint8(y)); - if (block->top && graphics.isBlockingSide(block->top)) { -#ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock top: " << z + 1 - pos.z<< " tex: " << int(block->top) << std::endl; -#endif - if (block->isFlat()) { - if (z + 1 - pos.z > 0 && z + 1 - pos.z < 0.2f) - nPos.z = (nPos.z < pos.z ? nPos.z : pos.z); - } - else { - if (z + 1 - pos.z < 0.2f) - nPos.z = (nPos.z < pos.z ? nPos.z : pos.z); - } - } - } - //if (inGroundContact) - // pos = nPos; - } - bool obj_blocked = false; - std::list & list = SpriteManagerHolder::Instance().getList(); - for (std::list::iterator i = list.begin(); i != list.end(); i++) { - if (isBoxInBox(*i)) { - if (Util::distance(pos, i->pos) > Util::distance(nPos, i->pos)) - obj_blocked = true; - } - } - if ((inGroundContact) && (obj_blocked == false)) - pos = nPos; - //else - // inGroundContact = 0; - - } void Pedestrian::die() { INFO << "DIE!!!" << std::endl; @@ -506,8 +307,8 @@ activeWeapon = chooseWeapon; OpenGTA::LocalPlayer::Instance().setCtrl(car.m_control); OpenGTA::SpriteManagerHolder::Instance().removePedById(0xffffffff); - cam.setVectors(Vector3D(car.pos.x, 10, car.pos.z), Vector3D(car.pos.x, 9.0f, car.pos.z), Vector3D(0, 0, -1)); - cam.setFollowMode(OpenGTA::SpriteManagerHolder::Instance().getCar(car.id()).pos); + cam.setVectors(Vector3D(car.pos().x, 10, car.pos().z), Vector3D(car.pos().x, 9.0f, car.pos().z), Vector3D(0, 0, -1)); + cam.setFollowMode(OpenGTA::SpriteManagerHolder::Instance().getCar(car.id()).pos()); cam.setCamGravity(true); OpenGTA::LocalPlayer::Instance().playerCarId = car.id(); @@ -672,8 +473,8 @@ activeWeapon = chooseWeapon; } } - Car::Car(const Vector3D & _pos, float _rot, uint32_t id, uint8_t _type, int16_t _remap) : - GameObject_common(_pos, _rot), + Car::Car(const Vector3D & _pos, float _rot, uint32_t id, uint8_t _type, int16_t _remap, PositionController& positionController) : + GameObject_common(positionController), CarSprite(0, -1, GraphicsBase::SpriteNumbers::CAR), OBox(), carInfo(*StyleHolder::Instance().get().findCarByModel(_type)) { type = _type; @@ -685,8 +486,8 @@ activeWeapon = chooseWeapon; m_Extent = Vector3D(INT2F_DIV128(carInfo.width), INT2F_DIV128(carInfo.depth), INT2F_DIV128(carInfo.height)); - m_M = TranslateMatrix3D(pos); - m_M.RotZ(-rot); + m_M = TranslateMatrix3D(pos()); + m_M.RotZ(-rot()); hitPoints = carInfo.damagable; } @@ -699,8 +500,8 @@ activeWeapon = chooseWeapon; sprType = GraphicsBase::SpriteNumbers::TRAIN; } - Car::Car(OpenGTA::Map::ObjectPosition& op, uint32_t id) : - GameObject_common(Vector3D(INT2FLOAT_WRLD(op.x), 6.05f-INT2FLOAT_WRLD(op.z), INT2FLOAT_WRLD(op.y))), + Car::Car(OpenGTA::Map::ObjectPosition& op, uint32_t id, PositionController& positionController) : + GameObject_common(positionController), CarSprite(0, -1, GraphicsBase::SpriteNumbers::CAR), OBox(), carInfo(*StyleHolder::Instance().get().findCarByModel(op.type)){ carId = id; @@ -717,10 +518,10 @@ activeWeapon = chooseWeapon; m_Extent = Vector3D(INT2F_DIV128(carInfo.width), INT2F_DIV128(carInfo.depth) , INT2F_DIV128(carInfo.height)); - m_M = TranslateMatrix3D(pos); + m_M = TranslateMatrix3D(pos()); - rot = op.rotation * 360 / 1024; - m_M.RotZ(-rot); + OpenGTA::updateStaticPositionController(op, positionController); + m_M.RotZ(-rot()); hitPoints = carInfo.damagable; } @@ -728,8 +529,8 @@ activeWeapon = chooseWeapon; GameObject_common(other), CarSprite(other), OBox(other), carInfo(*StyleHolder::Instance().get().findCarByModel(other.type)) { type = other.type; - m_M = TranslateMatrix3D(pos); - m_M.RotZ(-rot); + m_M = TranslateMatrix3D(pos()); + m_M.RotZ(-rot()); hitPoints = other.hitPoints; carId = other.carId; @@ -746,7 +547,7 @@ activeWeapon = chooseWeapon; return; } - + /* static const float velocityRotateK = 100.0; @@ -758,18 +559,18 @@ activeWeapon = chooseWeapon; switch(m_control.getTurn()) { case -1: - rot -= 0.2f * delta * velocity * velocityRotateK; + _rot -= 0.2f * delta * velocity * velocityRotateK; break; case 1: - rot += 0.2f * delta * velocity * velocityRotateK; + _rot += 0.2f * delta * velocity * velocityRotateK; break; case 0: break; } - if (rot >= 360.0f) - rot -= 360.0f; - if (rot < 0.0f) - rot += 360.0f; + if (_rot >= 360.0f) + _rot -= 360.0f; + if (_rot < 0.0f) + _rot += 360.0f; #ifdef NDEBUG static const float accelerationK = 0.00004; @@ -783,11 +584,6 @@ activeWeapon = chooseWeapon; switch(m_control.getMove()) { case -1: velocity -= accelerationK * delta; - /* - velocity += accelerationK * delta; - velocity += -slowK * velocity; - moveDelta.x -= sin(rot * M_PI / 180.0f) * velocity * delta; - moveDelta.z -= cos(rot * M_PI / 180.0f) * velocity * delta;*/ break; case 1: velocity += accelerationK * delta; @@ -816,11 +612,11 @@ activeWeapon = chooseWeapon; if (!inGroundContact) { gravitySpeed += 0.0005f *delta; - pos.y -= gravitySpeed; + pos().y -= gravitySpeed; if (gravitySpeed < 0.2f) - INFO << "bridge step? height: " << pos.y << " speed: " << gravitySpeed << std::endl; + INFO << "bridge step? height: " << pos().y << " speed: " << gravitySpeed << std::endl; else - INFO << "FALLING " << pos.y << " speed " << gravitySpeed << std::endl; + INFO << "FALLING " << pos().y << " speed " << gravitySpeed << std::endl; } else { if (gravitySpeed > 0.1) @@ -847,8 +643,10 @@ activeWeapon = chooseWeapon; } + + */ - //INFO << pos.x << " " << pos.y << " " << pos.z << std::endl;*/ + //INFO << pos().x << " " << pos().y << " " << pos().z << std::endl;*/ lastUpdateAt = ticks; } @@ -887,73 +685,73 @@ activeWeapon = chooseWeapon; assert(block); if (block->left && graphics.isBlockingSide(block->left)) { if (block->isFlat()) { - if (x - pos.x < 0 && x - pos.x > -0.2f) { - nPos.x = (nPos.x < pos.x) ? pos.x : nPos.x; + if (x - pos().x < 0 && x - pos().x > -0.2f) { + nPos.x = (nPos.x < pos().x) ? pos().x : nPos.x; } - else if (x - pos.x > 0 && x - pos.x < 0.2f) + else if (x - pos().x > 0 && x - pos().x < 0.2f) { - nPos.x = pos.x; + nPos.x = pos().x; } } else { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock left: " << x - pos.x << " tex: " << int(block->left) << std::endl; + INFO << "xblock left: " << x - pos().x << " tex: " << int(block->left) << std::endl; #endif - if (x - pos.x > 0 && x - pos.x < 0.2f) - nPos.x = pos.x; - else if (x - pos.x < 0 && x - pos.x > -0.2f) - nPos.x = (nPos.x < pos.x) ? pos.x : nPos.x; + if (x - pos().x > 0 && x - pos().x < 0.2f) + nPos.x = pos().x; + else if (x - pos().x < 0 && x - pos().x > -0.2f) + nPos.x = (nPos.x < pos().x) ? pos().x : nPos.x; } } if (block->right && block->isFlat() == false) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock right: " << pos.x - x - 1 << " tex: " << int(block->right) << std::endl; + INFO << "xblock right: " << pos().x - x - 1 << " tex: " << int(block->right) << std::endl; #endif - if (pos.x - x - 1 > 0 && pos.x - x - 1 < 0.2f) { - nPos.x = pos.x; + if (pos().x - x - 1 > 0 && pos().x - x - 1 < 0.2f) { + nPos.x = pos().x; } - else if (pos.x - x - 1 < 0 && pos.x - x - 1 > -0.2f) - nPos.x = (nPos.x > pos.x) ? pos.x : nPos.x; + else if (pos().x - x - 1 < 0 && pos().x - x - 1 > -0.2f) + nPos.x = (nPos.x > pos().x) ? pos().x : nPos.x; } if (block->top && graphics.isBlockingSide(block->top)) { if (block->isFlat()) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock top: " << z - pos.z << " tex: " << int(block->top) << std::endl; + INFO << "zblock top: " << z - pos().z << " tex: " << int(block->top) << std::endl; #endif - if (z - pos.z > 0 && z - pos.z < 0.2f) - nPos.z = pos.z; - else if (z - pos.z < 0 && z - pos.z > -0.2f) - nPos.z = (nPos.z < pos.z) ? pos.z : nPos.z; + if (z - pos().z > 0 && z - pos().z < 0.2f) + nPos.z = pos().z; + else if (z - pos().z < 0 && z - pos().z > -0.2f) + nPos.z = (nPos.z < pos().z) ? pos().z : nPos.z; } else { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock top: " << z - pos.z << " tex: " << int(block->top) << std::endl; + INFO << "zblock top: " << z - pos().z << " tex: " << int(block->top) << std::endl; #endif - if (z - pos.z > 0 && z - pos.z < 0.2f) - nPos.z = pos.z; - else if (z - pos.z < 0 && z - pos.z > -0.2f) - nPos.z = (nPos.z < pos.z) ? pos.z : nPos.z; + if (z - pos().z > 0 && z - pos().z < 0.2f) + nPos.z = pos().z; + else if (z - pos().z < 0 && z - pos().z > -0.2f) + nPos.z = (nPos.z < pos().z) ? pos().z : nPos.z; } } if (block->bottom && block->isFlat() == false) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock bottom: " << pos.z - z - 1 << " tex: " << int(block->bottom) << std::endl; + INFO << "zblock bottom: " << pos().z - z - 1 << " tex: " << int(block->bottom) << std::endl; #endif - if (pos.z - z - 1 > 0 && pos.z - z - 1 < 0.2f) { - nPos.z = pos.z; + if (pos().z - z - 1 > 0 && pos().z - z - 1 < 0.2f) { + nPos.z = pos().z; } - else if (pos.z - z - 1 < 0 && pos.z - z - 1 > -0.2f) - nPos.z = (nPos.z > pos.z) ? pos.z : nPos.z; + else if (pos().z - z - 1 < 0 && pos().z - z - 1 > -0.2f) + nPos.z = (nPos.z > pos().z) ? pos().z : nPos.z; } if (x >= 1 && y < map.getNumBlocksAtNew(PHYSFS_uint8(x - 1), PHYSFS_uint8(z))) { block = map.getBlockAtNew(PHYSFS_uint8(x - 1), PHYSFS_uint8(z), PHYSFS_uint8(y)); if (block->right && block->isFlat() == false) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock right: " << pos.x - x << " tex: " << int(block->right) << std::endl; + INFO << "xblock right: " << pos().x - x << " tex: " << int(block->right) << std::endl; #endif - if (pos.x - x < 0.2f) { - nPos.x = (nPos.x < pos.x ? pos.x : nPos.x); + if (pos().x - x < 0.2f) { + nPos.x = (nPos.x < pos().x ? pos().x : nPos.x); } } } @@ -961,15 +759,15 @@ activeWeapon = chooseWeapon; block = map.getBlockAtNew(PHYSFS_uint8(x + 1), PHYSFS_uint8(z), PHYSFS_uint8(y)); if (block->left && graphics.isBlockingSide(block->left)) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "xblock left: " << x + 1 - pos.x << " tex: " << int(block->left) << std::endl; + INFO << "xblock left: " << x + 1 - pos().x << " tex: " << int(block->left) << std::endl; #endif if (block->isFlat()) { - if (x + 1 - pos.x > 0 && x + 1 - pos.x < 0.2f) - nPos.x = (nPos.x < pos.x ? nPos.x : pos.x); + if (x + 1 - pos().x > 0 && x + 1 - pos().x < 0.2f) + nPos.x = (nPos.x < pos().x ? nPos.x : pos().x); } else { - if (x + 1 - pos.x < 0.2f) - nPos.x = (nPos.x < pos.x ? nPos.x : pos.x); + if (x + 1 - pos().x < 0.2f) + nPos.x = (nPos.x < pos().x ? nPos.x : pos().x); } } } @@ -977,10 +775,10 @@ activeWeapon = chooseWeapon; block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z - 1), PHYSFS_uint8(y)); if (block->bottom && block->isFlat() == false) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock bottom: " << pos.z - z << " tex: " << int(block->bottom) << std::endl; + INFO << "zblock bottom: " << pos().z - z << " tex: " << int(block->bottom) << std::endl; #endif - if (pos.z - z < 0.2f) { - nPos.z = (nPos.z < pos.z ? pos.z : nPos.z); + if (pos().z - z < 0.2f) { + nPos.z = (nPos.z < pos().z ? pos().z : nPos.z); } } } @@ -988,15 +786,15 @@ activeWeapon = chooseWeapon; block = map.getBlockAtNew(PHYSFS_uint8(x), PHYSFS_uint8(z + 1), PHYSFS_uint8(y)); if (block->top && graphics.isBlockingSide(block->top)) { #ifdef DEBUG_OLD_PED_BLOCK - INFO << "zblock top: " << z + 1 - pos.z << " tex: " << int(block->top) << std::endl; + INFO << "zblock top: " << z + 1 - pos().z << " tex: " << int(block->top) << std::endl; #endif if (block->isFlat()) { - if (z + 1 - pos.z > 0 && z + 1 - pos.z < 0.2f) - nPos.z = (nPos.z < pos.z ? nPos.z : pos.z); + if (z + 1 - pos().z > 0 && z + 1 - pos().z < 0.2f) + nPos.z = (nPos.z < pos().z ? nPos.z : pos().z); } else { - if (z + 1 - pos.z < 0.2f) - nPos.z = (nPos.z < pos.z ? nPos.z : pos.z); + if (z + 1 - pos().z < 0.2f) + nPos.z = (nPos.z < pos().z ? nPos.z : pos().z); } } } @@ -1007,16 +805,16 @@ activeWeapon = chooseWeapon; std::list & list = SpriteManagerHolder::Instance().getList(); for (std::list::iterator i = list.begin(); i != list.end(); i++) { if (isBoxInBox(*i)) { - if (Util::distance(pos, i->pos) > Util::distance(nPos, i->pos)) + if (Util::distance(pos(), i->pos()) > Util::distance(nPos, i->pos())) obj_blocked = true; } } - if (/*(inGroundContact) && */(obj_blocked == false)) + /* + if ((obj_blocked == false)) { - pos = nPos; - } - //else - // inGroundContact = 0; + _pos = nPos; + }*/ + } @@ -1070,7 +868,7 @@ activeWeapon = chooseWeapon; void Car::explode() { //SpriteManagerHolder::Instance().removeCar(carId); //return; - Vector3D exp_pos(pos); + Vector3D exp_pos(pos()); exp_pos.y += 0.1f; SpriteManagerHolder::Instance().createExplosion(exp_pos); sprNum = 0; @@ -1079,8 +877,8 @@ activeWeapon = chooseWeapon; delta = 0; } - SpriteObject::SpriteObject(OpenGTA::Map::ObjectPosition& op, uint32_t id) : - GameObject_common(Vector3D(INT2FLOAT_WRLD(op.x), 6.05f-INT2FLOAT_WRLD(op.z), INT2FLOAT_WRLD(op.y))), + SpriteObject::SpriteObject(OpenGTA::Map::ObjectPosition& op, uint32_t id, PositionController& positionController) : + GameObject_common(positionController), Sprite(0, -1, GraphicsBase::SpriteNumbers::OBJECT), OBox() { objId = id; GraphicsBase & style = StyleHolder::Instance().get(); @@ -1088,25 +886,26 @@ activeWeapon = chooseWeapon; m_Extent = Vector3D(INT2F_DIV128(style.objectInfos[op.type]->width), INT2F_DIV128(style.objectInfos[op.type]->depth), INT2F_DIV128(style.objectInfos[op.type]->height)); - m_M = TranslateMatrix3D(pos); - m_M.RotZ(-rot); - rot = op.rotation * 360 / 1024; + m_M = TranslateMatrix3D(pos()); + + OpenGTA::updateStaticPositionController(op, positionController); + m_M.RotZ(-rot()); isActive = true; } - SpriteObject::SpriteObject(Vector3D pos, Uint16 sprNum, OpenGTA::GraphicsBase::SpriteNumbers::SpriteTypes sprT) : - GameObject_common(pos), Sprite(sprNum, -1, sprT), OBox() { + SpriteObject::SpriteObject(Vector3D pos, Uint16 sprNum, OpenGTA::GraphicsBase::SpriteNumbers::SpriteTypes sprT, PositionController& positionController) : + GameObject_common(positionController), Sprite(sprNum, -1, sprT), OBox() { isActive = true; m_M = TranslateMatrix3D(pos); - m_M.RotZ(-rot); + m_M.RotZ(-rot()); } SpriteObject::SpriteObject(const SpriteObject & other) : GameObject_common(other), Sprite(other), OBox(other), objId(other.objId) { - m_M = TranslateMatrix3D(pos); - m_M.RotZ(-rot); + m_M = TranslateMatrix3D(pos()); + m_M.RotZ(-rot()); isActive = other.isActive; } @@ -1115,8 +914,8 @@ activeWeapon = chooseWeapon; anim.update(ticks); } - Projectile::Projectile(unsigned char t, float r, Vector3D p, Vector3D d, uint32_t ticks, uint32_t o) : - GameObject_common(p, r), + Projectile::Projectile(unsigned char t, Vector3D d, uint32_t ticks, uint32_t o, PositionController& positionController) : + GameObject_common(positionController), typeId(t), delta(d), endsAtTick(ticks), owner(o), lastUpdateAt(ticks) { endsAtTick = lastUpdateAt + 1000; @@ -1132,7 +931,7 @@ activeWeapon = chooseWeapon; if (bi.top) { Math::Plane plane(Vector3D(ci.x, ci.z, ci.y), Vector3D(0, 0, -1)); Vector3D hit_pos; - if (plane.segmentIntersect(pos, newp, hit_pos)) { + if (plane.segmentIntersect(pos(), newp, hit_pos)) { INFO << "intersect flat-t: " << hit_pos.x << " " << hit_pos.y << " " <= ci.x && hit_pos.x <= ci.x + 1) { newp = hit_pos; @@ -1143,7 +942,7 @@ activeWeapon = chooseWeapon; if (bi.left) { Math::Plane plane(Vector3D(ci.x, ci.z, ci.y), Vector3D(-1, 0, 0)); Vector3D hit_pos; - if (plane.segmentIntersect(pos, newp, hit_pos)) { + if (plane.segmentIntersect(pos(), newp, hit_pos)) { INFO << "intersect flat-l: " << hit_pos.x << " " << hit_pos.y << " " <= ci.y && hit_pos.z <= ci.y + 1) { newp = hit_pos; @@ -1162,7 +961,7 @@ activeWeapon = chooseWeapon; if (bi.left) { Math::Plane plane(Vector3D(ci.x, ci.z, ci.y), Vector3D(-1, 0, 0)); Vector3D hit_pos; - if (plane.segmentIntersect(pos, newp, hit_pos)) { + if (plane.segmentIntersect(pos(), newp, hit_pos)) { INFO << "intersect left: " << hit_pos.x << " " << hit_pos.y << " " <= ci.y && hit_pos.z <= ci.y + 1) { newp = hit_pos; @@ -1173,7 +972,7 @@ activeWeapon = chooseWeapon; if (bi.right && !bi.isFlat()) { Math::Plane plane(Vector3D(ci.x+1, ci.z, ci.y), Vector3D(1, 0, 0)); Vector3D hit_pos; - if (plane.segmentIntersect(pos, newp, hit_pos)) { + if (plane.segmentIntersect(pos(), newp, hit_pos)) { INFO << "intersect right: " << hit_pos.x << " " << hit_pos.y << " " <= ci.y && hit_pos.z <= ci.y + 1) { newp = hit_pos; @@ -1184,7 +983,7 @@ activeWeapon = chooseWeapon; if (bi.top) { Math::Plane plane(Vector3D(ci.x, ci.z, ci.y), Vector3D(0, 0, -1)); Vector3D hit_pos; - if (plane.segmentIntersect(pos, newp, hit_pos)) { + if (plane.segmentIntersect(pos(), newp, hit_pos)) { INFO << "intersect top: " << hit_pos.x << " " << hit_pos.y << " " <= ci.x && hit_pos.x <= ci.x + 1) { newp = hit_pos; @@ -1195,7 +994,7 @@ activeWeapon = chooseWeapon; if (bi.bottom && !bi.isFlat()) { Math::Plane plane(Vector3D(ci.x, ci.z, ci.y+1), Vector3D(0, 0, 1)); Vector3D hit_pos; - if (plane.segmentIntersect(pos, newp, hit_pos)) { + if (plane.segmentIntersect(pos(), newp, hit_pos)) { INFO << "intersect bottom: " << hit_pos.x << " " << hit_pos.y << " " <= ci.x && hit_pos.x <= ci.x + 1) { newp = hit_pos; @@ -1209,10 +1008,11 @@ activeWeapon = chooseWeapon; void Projectile::update(uint32_t ticks) { Uint32 dt = ticks - lastUpdateAt; - Vector3D new_pos(pos + delta * dt); - /*INFO << "p-m " << pos.x << " " << pos.y << " " << pos.z << - " to " << new_pos.x << " " << new_pos.y << " " << new_pos.z << std::endl; - */ + + + /* + Vector3D new_pos(pos() + delta * dt); + std::list & list = SpriteManagerHolder::Instance().getList(); for (std::list::iterator i = list.begin(); i != list.end(); ++i) { Pedestrian & ped = *i; @@ -1221,9 +1021,9 @@ activeWeapon = chooseWeapon; if (ped.isDead) continue; - if (ped.isLineInBox( pos, new_pos ) ) { + if (ped.isLineInBox( pos(), new_pos ) ) { Vector3D p; - ped.lineCrossBox(pos, new_pos, p); + ped.lineCrossBox(pos(), new_pos, p); float angle = Util::xz_angle(Vector3D(0,0,0), p); INFO << angle << std::endl; if (angle <= 90.0f || angle > 270.0f) @@ -1243,10 +1043,10 @@ activeWeapon = chooseWeapon; for (std::list::iterator i = clist.begin(); i != clist.end(); i++) { Car & car = *i; - if (car.isLineInBox(pos, new_pos)) { + if (car.isLineInBox(pos(), new_pos)) { INFO << "CAR HIT" << std::endl; Vector3D p; - car.lineCrossBox(pos, new_pos, p); + car.lineCrossBox(pos(), new_pos, p); car.damageAt(p, 5); //INFO << Util::xz_angle(Vector3D(0,0,0), p) << std::endl; delta = Vector3D(0, 0, 0); @@ -1257,7 +1057,7 @@ activeWeapon = chooseWeapon; } } - Util::CellIterator oi(pos); + Util::CellIterator oi(pos()); int collided = 0; if (oi.isValid()) { Map::BlockInfo & bi = oi.getBlock(); @@ -1277,10 +1077,13 @@ activeWeapon = chooseWeapon; if (ni.isValid()) collided += testCollideBlock(ni, new_pos); } - if (collided) - delta = Vector3D(0, 0, 0); - pos = new_pos; + if (collided) + { + delta = Vector3D(0, 0, 0); + } + _pos = new_pos; + */ lastUpdateAt = ticks; } diff --git a/game_objects.h b/game_objects.h index 147e0e7..ed7b8f7 100755 --- a/game_objects.h +++ b/game_objects.h @@ -38,21 +38,31 @@ namespace OpenGTA { struct GameObject_common; typedef OpenSteer::AbstractTokenForProximityDatabase ProximityToken; typedef OpenSteer::AbstractProximityDatabase ProximityDatabase; + + + struct GameObject_common { - Vector3D pos; - float rot; - float bSphereRadius; - //uint8_t activeState; - GameObject_common() : - pos(0, 0, 0), rot(0), bSphereRadius(0.1f) {} - GameObject_common(const Vector3D & p) : pos(p), rot(0) {} - GameObject_common(const Vector3D & p, float r) : pos(p), rot(r) {} - GameObject_common(const GameObject_common & o) : - pos(o.pos), rot(o.rot), bSphereRadius(o.bSphereRadius) {} + PositionController& positionController; + + float bSphereRadius = 0.1f; + + float rot() const { return positionController.rot; } + + Vector3D pos() const { return Vector3D(positionController.pos(0), positionController.pos(1), positionController.pos(2)); } + + GameObject_common() = delete; + + GameObject_common(PositionController& newPositionController) : positionController(newPositionController) {} + + + GameObject_common(const GameObject_common & o) = default; + float heightOverTerrain(const Vector3D &); ProximityToken* proxToken; }; + + class Sprite { public: struct Animation : public Util::Animation { @@ -78,19 +88,23 @@ namespace OpenGTA { class Pedestrian : public GameObject_common, public Sprite, public OBox { public: - Pedestrian(Vector3D, const Vector3D &, uint32_t id, Sint16 remapId = -1); + + Pedestrian(Vector3D, const Vector3D &, uint32_t id, Sint16 remapId, PlayerPedController& newPlayerController); Pedestrian(const Pedestrian & o); uint32_t pedId; inline uint32_t id() const { return pedId; } void equip(uint8_t eq_id); - void giveItem(uint8_t id, uint32_t amount); - PedController m_control; - void update(Uint32 ticks); + void giveItem(uint8_t id, uint32_t amount); + + PlayerPedController& playerController; + //PedController m_control; + + + void update(Uint32 ticks); Uint32 lastUpdateAt; Uint32 lastWeaponTick; Vector3D speedForces; bool inGroundContact; - void tryMove(Vector3D nPos); uint8_t isDead; void getShot(uint32_t shooterId, uint32_t dmg, bool front = true); void die(); @@ -147,8 +161,8 @@ namespace OpenGTA { class Car : public GameObject_common, public CarSprite, public OBox { public: Car(const Car & o); - Car(OpenGTA::Map::ObjectPosition&, uint32_t id); - Car(const Vector3D & _pos, float _rot, uint32_t id, uint8_t _type, int16_t _remap = -1); + Car(OpenGTA::Map::ObjectPosition&, uint32_t id, PositionController& positionController); + Car(const Vector3D & _pos, float _rot, uint32_t id, uint8_t _type, int16_t _remap, PositionController& positionController); uint32_t carId; inline uint32_t id() const { return carId; } GraphicsBase::CarInfo & carInfo; @@ -177,8 +191,8 @@ namespace OpenGTA { class SpriteObject : public GameObject_common, public Sprite, public OBox { public: - SpriteObject(OpenGTA::Map::ObjectPosition&, uint32_t id); - SpriteObject(Vector3D pos, Uint16 spriteNum, GraphicsBase::SpriteNumbers::SpriteTypes st); + SpriteObject(OpenGTA::Map::ObjectPosition&, uint32_t id, PositionController& positionController); + SpriteObject(Vector3D pos, Uint16 spriteNum, GraphicsBase::SpriteNumbers::SpriteTypes st, PositionController& positionController); SpriteObject(const SpriteObject & o); uint32_t objId; inline uint32_t id() const { return objId; } @@ -200,7 +214,7 @@ namespace OpenGTA { class Projectile : public GameObject_common { public: - Projectile(uint8_t, float, Vector3D, Vector3D, uint32_t, uint32_t); + Projectile(uint8_t, Vector3D, uint32_t, uint32_t, PositionController& positionController); Projectile(const Projectile & other); uint8_t typeId; Vector3D delta; diff --git a/gl_cityview.cpp b/gl_cityview.cpp index fef3c96..4bdbf0d 100755 --- a/gl_cityview.cpp +++ b/gl_cityview.cpp @@ -219,6 +219,8 @@ namespace OpenGTA { void CityView::createLevelObject(OpenGTA::Map::ObjectPosition *obj) { SpriteManager & s_man = SpriteManagerHolder::Instance(); uint32_t id = TypeIdBlackBox::requestId(); + + /* if (obj->remap >= 128) { Car car(*obj, id); s_man.add(car); @@ -226,7 +228,7 @@ namespace OpenGTA { else { SpriteObject gobj(*obj, id); s_man.add(gobj); - } + }*/ } void CityView::setZoom(const GLfloat zoom) { zoomLevel = zoom; diff --git a/localplayer.h b/localplayer.h index 75acff3..6987c16 100755 --- a/localplayer.h +++ b/localplayer.h @@ -21,10 +21,11 @@ namespace OpenGTA { numLives = 0; pc_ptr = NULL; } + /* PedController & getCtrl() { assert(pc_ptr); return *pc_ptr; - } + }*/ void setCtrl(PedController & pc) { pc_ptr = &pc; } diff --git a/net/udp_client.cpp b/net/udp_client.cpp new file mode 100755 index 0000000..0df3fa8 --- /dev/null +++ b/net/udp_client.cpp @@ -0,0 +1,154 @@ +#include "udp_client.h" +#include + +namespace OpenGTA { + + + void updateStaticPositionController(const OpenGTA::Map::ObjectPosition& op, PositionController& c) + { + + auto m_M = TranslateMatrix3D(Vector3D(c.pos(0), c.pos(1), c.pos(2))); + + m_M.RotZ(-c.rot); + + c.rot = op.rotation * 360 / 1024; + } + + + PositionController& UdpClient::createStaticPositionController(Vector3D pos) + { + PositionController c; + c.pos = Eigen::Vector3f{ pos.x, pos.y, pos.z }; + c.rot = 0; + staticPositionControllers[staticPosControllerCount] = c; + + staticPosControllerCount++; + + return staticPositionControllers[staticPosControllerCount - 1]; + } + + + PositionController& UdpClient::createStaticPositionController(Vector3D pos, float rot) + { + PositionController c; + c.pos = Eigen::Vector3f{ pos.x, pos.y, pos.z }; + c.rot = rot; + staticPositionControllers[staticPosControllerCount] = c; + + staticPosControllerCount++; + + return staticPositionControllers[staticPosControllerCount - 1]; + } + + + + void UdpClient::handleReceive(const boost::system::error_code& error, std::size_t bytes_transferred) { + if (error) { + std::cout << "Receive failed: " << error.message() << "\n"; + return; + } + + net::ServerDatagramToSend serverDatagram; + + std::copy(&recvBuffer[0], &recvBuffer[0] + sizeof(net::ServerDatagramToSend), reinterpret_cast(&serverDatagram)); + + if (serverDatagram.number > latestServerDatagram.number) + { + + for (uint16_t i = 0; i < serverDatagram.numberOfPlayers; i++) + { + if (serverDatagram.players[i].type != serverDatagram.yourType) + { + + } + } + + + latestServerDatagram = serverDatagram; + } + + + + wait(); + + } + + void UdpClient::wait() + { + receiverSocket.async_receive_from(boost::asio::buffer(recvBuffer), + remoteEndpoint, + boost::bind(&UdpClient::handleReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + } + + void UdpClient::udpSendTimerHandler(const boost::system::error_code& error) + { + + player.pressedButtons = playerController.pressedButtons; + player.posX = playerController.pos(0); + player.posY = playerController.pos(1); + player.posZ = playerController.pos(2); + player.angle = playerController.rot; + + std::array arrayBuffer; + + arrayBuffer.fill(0); + + std::copy(reinterpret_cast(&player), reinterpret_cast(&player) + sizeof(net::ReceivedDatagram), &arrayBuffer[0]); + + //std::copy(&arrayBuffer[0], &arrayBuffer[0] + sizeof(net::ReceivedDatagram), reinterpret_cast(&player)); + + + + udp::socket socket(udpSenderIoContext); + + udp::endpoint remote_endpoint = udp::endpoint(boost::asio::ip::make_address("127.0.0.1"), 13); + + socket.open(udp::v4()); + + boost::system::error_code err; + + auto sent = socket.send_to(boost::asio::buffer(arrayBuffer), remote_endpoint, 0, err); + + socket.close(); + + player.number++; + + + + + if (!quit) + { + sendTimer.expires_at(sendTimer.expiry() + boost::asio::chrono::milliseconds(50)); + sendTimer.async_wait(boost::bind(&UdpClient::udpSendTimerHandler, this, boost::asio::placeholders::error)); + } + } + + void UdpClient::start() + { + sendTimer.async_wait(boost::bind(&UdpClient::udpSendTimerHandler, this, boost::asio::placeholders::error)); + + timerThread = std::thread([this]() {this->udpSenderIoContext.run(); }); + } + + UdpClient::UdpClient() + { + + player.angle = 0; + player.localTime = 0; + player.number = 1; + player.posX = 12.0; + player.posY = 6.1; + player.posZ = 12.0; + + receiverSocket.open(udp::v4()); + receiverSocket.bind(udp::endpoint(boost::asio::ip::make_address("127.0.0.1"), 14)); + + wait(); + + receiverThread = std::thread([this]() {this->udpReceiverIoContext.run(); }); + + + } + + +} \ No newline at end of file diff --git a/net/udp_client.h b/net/udp_client.h new file mode 100755 index 0000000..272d6ba --- /dev/null +++ b/net/udp_client.h @@ -0,0 +1,167 @@ +#ifndef UDP_CLIENT_H_INCLUDED +#define UDP_CLIENT_H_INCLUDED +#include "Singleton.h" +#include "game_objects.h" +#include +#include "entity_controller.h" + + +namespace net +{ +#pragma pack(push, 1) + struct ReceivedDatagram + { + uint32_t number; + uint32_t localTime; + float posX; + float posY; + float posZ; + float angle; + uint8_t pressedButtons; + + }; + + struct PlayerDatagramToSend + { + uint16_t type; + uint16_t state; + float posX; + float posY; + float posZ; + float angle; + float velX; + float velY; + float velZ; + }; + + struct ServerDatagramToSend + { + uint32_t number = 0; + uint32_t localTime; + uint16_t yourType; + uint16_t numberOfPlayers; + + std::array players; + + + }; +#pragma pack(pop) + + +} + + + +namespace OpenGTA { + + using boost::asio::ip::udp; + using boost::asio::ip::address; + + void updateStaticPositionController(const OpenGTA::Map::ObjectPosition& op, PositionController& c); + + class UdpClient + { + public: + + PlayerPedController playerController; + + std::array staticPositionControllers; + size_t staticPosControllerCount = 0; + + PositionController& createStaticPositionController(Vector3D pos); + PositionController& createStaticPositionController(Vector3D pos, float rot); + + net::ReceivedDatagram player; + + net::ServerDatagramToSend latestServerDatagram; + + + boost::asio::io_context udpReceiverIoContext; + boost::asio::io_context udpSenderIoContext; + + + udp::socket receiverSocket{ udpReceiverIoContext }; + udp::socket senderSocket{ udpSenderIoContext }; + + std::array recvBuffer; + udp::endpoint remoteEndpoint; + + boost::asio::steady_timer sendTimer{ udpSenderIoContext, boost::asio::chrono::milliseconds(50) }; + + std::thread receiverThread; + std::thread timerThread; + + volatile bool quit = false; + + UdpClient(); + + void wait(); + void handleReceive(const boost::system::error_code& error, std::size_t bytes_transferred); + + void udpSendTimerHandler(const boost::system::error_code& error); + + void start(); + }; + + + typedef Loki::SingletonHolder LocalClient; + + + + /* + + + class PlayerController : public Util::KeyHandler { + public: + PlayerController() { + reset(); + } + void reset() { + playerId = TypeIdBlackBox::getPlayerId(); + cash = 0; + wantedLevel = 0; + modifier = 0; + numLives = 0; + pc_ptr = NULL; + } + PedController & getCtrl() { + assert(pc_ptr); + return *pc_ptr; + } + void setCtrl(PedController & pc) { + pc_ptr = &pc; + } + void giveLives(uint16_t k) { + numLives += k; + } + void disableCtrl(bool soft); + void enableCtrl(); + Pedestrian & getPed(); + Car& getCar(); + int32_t getNumLives() { return numLives; } + int32_t getWantedLevel() { return wantedLevel; } + uint32_t getCash() { return cash; } + bool up(const uint32_t & key); + bool down(const uint32_t & key); + uint32_t getId() { return playerId; } + void addCash(uint32_t v) { cash += v; } + void setWanted(int32_t v) { wantedLevel = v; } + void addWanted(uint32_t v) { wantedLevel += v; if (wantedLevel > 5) wantedLevel = 5; } + + + uint32_t playerCarId = 0; + private: + uint32_t playerId; + uint32_t cash; + int32_t wantedLevel; + uint32_t modifier; + int32_t numLives; + PedController * pc_ptr; + + + }; + + typedef Loki::SingletonHolder LocalPlayer;*/ +} + +#endif diff --git a/spritemanager.cpp b/spritemanager.cpp index 8a73179..5601b93 100755 --- a/spritemanager.cpp +++ b/spritemanager.cpp @@ -28,6 +28,8 @@ #include "timer.h" #include "id_sys.h" +#include "net/udp_client.h" + namespace OpenGTA { //SpriteManager::SpriteManager() : trainSystem(AbstractContainer::objs){ SpriteManager::SpriteManager() { @@ -153,11 +155,15 @@ namespace OpenGTA { } removeDeadStuff(); + + /* if (num_peds < 50 && num_peds > 2 && ticks - lastCreateTick > 100) { - //MapHelper::createPeds(5); + Map & map = OpenGTA::MapHolder::Instance().get(); lastCreateTick = ticks; - while (1) { + + + while (1) { Util::TupleOfUint8 tu8 = creationArea.getValidCoord(); INFO << "testing: " << int(tu8.first) << ", " << int(tu8.second) << std::endl; int k = -1; @@ -181,7 +187,7 @@ namespace OpenGTA { OpenGTA::SpriteManagerHolder::Instance().add(p); break; } - } + }*/ } #define POS_INSIDE_RECT(pos, r) ((pos.x >= r.x) && \ @@ -191,7 +197,7 @@ namespace OpenGTA { for (AbstractContainer::Storage_T_Iterator i = AbstractContainer::objs.begin(); i != AbstractContainer::objs.end(); ++i) { Pedestrian & ped = (*i); - if (POS_INSIDE_RECT(ped.pos, r)) + if (POS_INSIDE_RECT(ped.pos(), r)) //if ((ped.pos.x >= r.x) && (ped.pos.x <= r.x + r.w) && // (ped.pos.z >= r.y) && (ped.pos.z <= r.y + r.h)) draw(ped); @@ -203,7 +209,7 @@ namespace OpenGTA { SpriteObject & obj = (*i); //if ((obj.pos.x >= r.x) && (obj.pos.x <= r.x + r.w) && // (obj.pos.z >= r.y) && (obj.pos.z <= r.y + r.h)) - if (POS_INSIDE_RECT(obj.pos, r)) + if (POS_INSIDE_RECT(obj.pos(), r)) draw(obj); } for (AbstractContainer::Storage_T_Iterator i = AbstractContainer::objs.begin(); @@ -211,7 +217,7 @@ namespace OpenGTA { Car & car = (*i); // if ((car.pos.x >= r.x) && (car.pos.x <= r.x + r.w) && // (car.pos.z >= r.y) && (car.pos.z <= r.y + r.h)) - if (POS_INSIDE_RECT(car.pos, r)) + if (POS_INSIDE_RECT(car.pos(), r)) draw(car); } @@ -219,7 +225,7 @@ namespace OpenGTA { typedef ProjectileListType::iterator ProjectileIterator; for (ProjectileIterator i = activeProjectiles.begin(); i != activeProjectiles.end(); ++i) { Projectile & prj = (*i); - if (POS_INSIDE_RECT(prj.pos, r)) + if (POS_INSIDE_RECT(prj.pos(), r)) draw(prj); } glColor3f(1, 1, 1); @@ -242,8 +248,8 @@ namespace OpenGTA { #define GL_OBJ_COMMON(o) GL_CHECKERROR; \ glPushMatrix(); \ -glTranslatef(o.pos.x, o.pos.y, o.pos.z); \ -glRotatef(o.rot, 0, 1, 0); \ +glTranslatef(o.pos().x, o.pos().y, o.pos().z); \ +glRotatef(o.rot(), 0, 1, 0); \ //glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat*)o.m_M.m) #define DRAW_TEX_QUADS_OBJ(t, w, h) glBindTexture(GL_TEXTURE_2D, t.inPage); \ @@ -418,7 +424,7 @@ void SpriteManager::drawExplosion(SpriteObject & obj) { return; } glPushMatrix(); - glTranslatef(obj.pos.x, obj.pos.y, obj.pos.z); + glTranslatef(obj.pos().x, obj.pos().y, obj.pos().z); //glRotatef(obj.rot, 0, 1, 0); glGetFloatv(GL_MODELVIEW_MATRIX, *obj.m_M.m); @@ -582,8 +588,8 @@ void SpriteManager::draw(Projectile & proj) { const float h = 0.05f; glPushMatrix(); \ - glTranslatef(proj.pos.x, proj.pos.y, proj.pos.z); \ - glRotatef(proj.rot, 0, 1, 0); + glTranslatef(proj.pos().x, proj.pos().y, proj.pos().z); \ + glRotatef(proj.rot(), 0, 1, 0); glDisable(GL_TEXTURE_2D); glBegin(GL_QUADS); @@ -607,7 +613,7 @@ void SpriteManager::removeDeadStuff() { AbstractContainer::Storage_T_Iterator i = AbstractContainer::objs.begin(); while (i != AbstractContainer::objs.end()) { Pedestrian & ped = (*i); - if ((ped.isDead == 3) && (creationArea.isOnScreen(ped.pos) == false)) { + if ((ped.isDead == 3) && (creationArea.isOnScreen(ped.pos()) == false)) { AbstractContainer::Storage_T_Iterator j = i; j++; AbstractContainer::objs.erase(i); i = j; @@ -650,14 +656,20 @@ void SpriteManager::setDrawTexture(bool v) { } void SpriteManager::createProjectile(uint8_t typeId, float r, Vector3D p, Vector3D d, Uint32 & ticks, Uint32 & owner) { - activeProjectiles.push_back(Projectile(typeId, r, p, d, ticks, owner)); + + auto& posController = LocalClient::Instance().createStaticPositionController(p, r); + + activeProjectiles.push_back(Projectile(typeId, d, ticks, owner, posController)); } void SpriteManager::createExplosion(Vector3D center) { + +/* + SpriteObject expl(center, 0, GraphicsBase::SpriteNumbers::EX); expl.anim = SpriteObject::Animation(getAnimationById(99)); expl.anim.set(Util::Animation::PLAY_FORWARD, Util::Animation::STOP); - add(expl); + add(expl);*/ } } diff --git a/viewer.cpp b/viewer.cpp index de055cf..499cd52 100755 --- a/viewer.cpp +++ b/viewer.cpp @@ -52,6 +52,7 @@ #include "font_cache.h" #include "ai.h" +#include "net/udp_client.h" @@ -544,22 +545,27 @@ void handleKeyUp(SDL_Keysym* keysym) { switch ( keysym->sym ) { case 'j': - OpenGTA::LocalPlayer::Instance().getCtrl().releaseTurnLeft(); + + OpenGTA::LocalClient::Instance().playerController.releaseTurnLeft(); + //OpenGTA::LocalPlayer::Instance().getCtrl().releaseTurnLeft(); //OpenGTA::LocalPlayer::Instance().turn = 0; //OpenGTA::LocalPlayer::Instance().setTurn(0); break; case 'l': - OpenGTA::LocalPlayer::Instance().getCtrl().releaseTurnRight(); + OpenGTA::LocalClient::Instance().playerController.releaseTurnRight(); + //OpenGTA::LocalPlayer::Instance().getCtrl().releaseTurnRight(); //OpenGTA::LocalPlayer::Instance().turn = 0; //OpenGTA::LocalPlayer::Instance().setTurn(0); break; case 'i': - OpenGTA::LocalPlayer::Instance().getCtrl().releaseMoveForward(); + OpenGTA::LocalClient::Instance().playerController.releaseMoveForward(); + //OpenGTA::LocalPlayer::Instance().getCtrl().releaseMoveForward(); //OpenGTA::LocalPlayer::Instance().move = 0; //OpenGTA::LocalPlayer::Instance().setMove(0); break; case 'k': - OpenGTA::LocalPlayer::Instance().getCtrl().releaseMoveBack(); + OpenGTA::LocalClient::Instance().playerController.releaseMoveBack(); + // OpenGTA::LocalPlayer::Instance().getCtrl().releaseMoveBack(); //OpenGTA::LocalPlayer::Instance().move = 0; //OpenGTA::LocalPlayer::Instance().setMove(0); break; @@ -576,7 +582,7 @@ void handleKeyUp(SDL_Keysym* keysym) { break; case SDLK_LCTRL: - OpenGTA::LocalPlayer::Instance().getCtrl().setFireWeapon(false); + //OpenGTA::LocalPlayer::Instance().getCtrl().setFireWeapon(false); break; default: break; @@ -586,12 +592,12 @@ void handleKeyUp(SDL_Keysym* keysym) { void draw_mapmode(); void create_ped_at(const Vector3D v) { - OpenGTA::Pedestrian p(Vector3D(0.2f, 0.5f, 0.2f), v, 0xffffffff); + OpenGTA::Pedestrian p(Vector3D(0.2f, 0.5f, 0.2f), v, 0xffffffff, -1, OpenGTA::LocalClient::Instance().playerController); p.remap = OpenGTA::StyleHolder::Instance().get().getRandomPedRemapNumber(); INFO << "using remap: " << p.remap << std::endl; OpenGTA::Pedestrian & pr = OpenGTA::SpriteManagerHolder::Instance().addPed(p); pr.switchToAnim(1); - OpenGTA::LocalPlayer::Instance().setCtrl(pr.m_control); + //OpenGTA::LocalPlayer::Instance().setCtrl(pr.m_control); GUI::create_ingame_gui(1); //pr.m_control = &OpenGTA::LocalPlayer::Instance(); //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).giveItem(1, 255); @@ -605,6 +611,7 @@ void updateAnim() { void create_car_at(const Vector3D v) { + /* int carId; if (city_num == 0) { @@ -617,13 +624,13 @@ void create_car_at(const Vector3D v) { OpenGTA::Car c2(Vector3D(v.x, v.y, v.z), 180, 999999, carId, 0); - OpenGTA::SpriteManagerHolder::Instance().add(c2); + OpenGTA::SpriteManagerHolder::Instance().add(c2);*/ } void explode_ped() { try { OpenGTA::Pedestrian & ped = OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff); - Vector3D p(ped.pos); + Vector3D p(ped.pos()); p.y += 0.2f; OpenGTA::SpriteManagerHolder::Instance().createExplosion(p); } @@ -645,46 +652,13 @@ void zoomToTrain(int k) { #include "cell_iterator.h" namespace OpenGTA { - void ai_step_fake(OpenGTA::Pedestrian *p) { - try { - OpenGTA::Pedestrian & pr = OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff); - float t_angle = Util::xz_angle(p->pos, pr.pos); - //INFO << "dist " << Util::distance(p->pos, pr.pos) << std::endl; - //INFO << "angle " << t_angle << std::endl; - //INFO << "myrot: " << p->rot << std::endl; - if (Util::distance(p->pos, pr.pos) > 3) { - p->m_control.setTurnLeft(false); - p->m_control.setTurnRight(false); - if (t_angle > p->rot) - p->m_control.setTurnLeft(true); - else - p->m_control.setTurnRight(true); - } - else { - p->m_control.setMoveForward(true); - int k = rand() % 5; - if (k == 0) { - p->m_control.setTurnLeft(false); - p->m_control.setTurnRight(false); - } - else if (k == 1) { - p->m_control.setTurnLeft(true); - p->m_control.setTurnRight(false); - } - else if (k == 2) { - p->m_control.setTurnLeft(false); - p->m_control.setTurnRight(true); - } - } - } - catch (Util::UnknownKey & e) { - } - - } + } #include "id_sys.h" void add_auto_ped() { + + /* try { OpenGTA::Pedestrian & pr = OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff); int id = OpenGTA::TypeIdBlackBox::requestId(); @@ -702,11 +676,12 @@ void add_auto_ped() { } catch (Util::UnknownKey & e) { WARN << "Cannot place peds now - press F4 to switch to player-mode first!" << std::endl; - } + }*/ } void toggle_player_run() { - OpenGTA::PedController * pc = &OpenGTA::LocalPlayer::Instance().getCtrl(); + + /*OpenGTA::PedController * pc = &OpenGTA::LocalPlayer::Instance().getCtrl(); INFO << std::endl; if (!pc) { @@ -716,7 +691,7 @@ void toggle_player_run() { if (!pc->getRunning()) pc->setRunning(true); else - pc->setRunning(false); + pc->setRunning(false);*/ } void show_gamma_config() { @@ -755,19 +730,19 @@ void show_gamma_config() { void car_toggle() { OpenGTA::Pedestrian & pped = OpenGTA::LocalPlayer::Instance().getPed(); - Vector3D pos = pped.pos; + Vector3D pos = pped.pos(); std::list & list = OpenGTA::SpriteManagerHolder::Instance().getList(); float min_dist = 360; float _d; std::list::iterator j = list.end(); for (std::list::iterator i = list.begin(); i != list.end(); i++) { - if ((_d = Util::distance(pos, i->pos)) < min_dist) { + if ((_d = Util::distance(pos, i->pos())) < min_dist) { j = i; min_dist = _d; } } assert(j != list.end()); - std::cout << j->id() << " " << j->pos.x << ", " << j->pos.y << ", " << j->pos.z << std::endl; + std::cout << j->id() << " " << j->pos().x << ", " << j->pos().y << ", " << j->pos().z << std::endl; Vector3D p_door(j->carInfo.door[0].rpx / 64.0f, 0, j->carInfo.door[0].rpy / 64.0f); @@ -846,7 +821,7 @@ void handleKeyPress( SDL_Keysym *keysym ) { Vector3D p(cam.getEye()); create_ped_at(p); cam.setVectors( Vector3D(p.x, 10, p.z), Vector3D(p.x, 9.0f, p.z), Vector3D(0, 0, -1) ); - cam.setFollowMode(OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).pos); + cam.setFollowMode(OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).pos()); cam.setCamGravity(true); } else { @@ -896,23 +871,19 @@ void handleKeyPress( SDL_Keysym *keysym ) { toggle_player_run(); break; case SDLK_LCTRL: - OpenGTA::LocalPlayer::Instance().getCtrl().setFireWeapon(); + //OpenGTA::LocalPlayer::Instance().getCtrl().setFireWeapon(); break; case '1': - //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(1); - OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(1); + //OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(1); break; case '2': - //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(2); - OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(2); + //OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(2); break; case '3': - //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(3); - OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(3); + //OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(3); break; case '4': - //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(4); - OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(4); + //OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(4); break; case '5': //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(5); @@ -930,8 +901,7 @@ void handleKeyPress( SDL_Keysym *keysym ) { //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(9); break; case '0': - OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(0); - //OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).equip(0); + //OpenGTA::LocalPlayer::Instance().getCtrl().setActiveWeapon(0); break; case 'w': cam.setSpeed(0.2f); @@ -941,6 +911,8 @@ void handleKeyPress( SDL_Keysym *keysym ) { break; case 'j': { + OpenGTA::LocalClient::Instance().playerController.setTurnLeft(); + /* OpenGTA::LocalPlayer::Instance().getCtrl().setTurnLeft(); if (OpenGTA::LocalPlayer::Instance().playerCarId == 0) @@ -949,40 +921,46 @@ void handleKeyPress( SDL_Keysym *keysym ) { OpenGTA::Pedestrian & pped = OpenGTA::LocalPlayer::Instance().getPed(); pped.aiMode = 0; pped.aimCarId = 0; - } + }*/ } break; case 'l': { + OpenGTA::LocalClient::Instance().playerController.setTurnRight(); + /* OpenGTA::LocalPlayer::Instance().getCtrl().setTurnRight(); if (OpenGTA::LocalPlayer::Instance().playerCarId == 0) { OpenGTA::Pedestrian & pped = OpenGTA::LocalPlayer::Instance().getPed(); pped.aiMode = 0; pped.aimCarId = 0; - } + }*/ } break; case 'i': { + OpenGTA::LocalClient::Instance().playerController.setMoveForward(); + /* OpenGTA::LocalPlayer::Instance().getCtrl().setMoveForward(); if (OpenGTA::LocalPlayer::Instance().playerCarId == 0) { OpenGTA::Pedestrian & pped = OpenGTA::LocalPlayer::Instance().getPed(); pped.aiMode = 0; pped.aimCarId = 0; - } + }*/ } break; case 'k': { + OpenGTA::LocalClient::Instance().playerController.setMoveBack(); + /* OpenGTA::LocalPlayer::Instance().getCtrl().setMoveBack(); if (OpenGTA::LocalPlayer::Instance().playerCarId == 0) { OpenGTA::Pedestrian & pped = OpenGTA::LocalPlayer::Instance().getPed(); pped.aiMode = 0; pped.aimCarId = 0; - } + }*/ } break; case 'f': @@ -1255,15 +1233,22 @@ void run_main() { follow_toggle = true; city->setViewMode(false); Vector3D p(cam.getEye()); + + + create_ped_at(p); cam.setVectors(Vector3D(p.x, 10, p.z), Vector3D(p.x, 9.0f, p.z), Vector3D(0, 0, -1)); - cam.setFollowMode(OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).pos); + cam.setFollowMode(OpenGTA::SpriteManagerHolder::Instance().getPedById(0xffffffff).pos()); cam.setCamGravity(true); + OpenGTA::LocalClient::Instance().start(); + + /* + Vector3D px(cam.getEye() + Vector3D(2.0, 0.0, 2.0)); create_car_at(px); - + */ #endif