diff options
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 209 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_modify.cpp | 83 |
2 files changed, 271 insertions, 21 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b11772e7b20..35b337f5a15 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12661,25 +12661,153 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data << float(GetSpeed(mtype)); break; case MOVE_RUN_BACK: - data.Initialize(SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED, 1 + 8 + 4); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[2]); + + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[2]); + + data << float(GetSpeed(mtype)); break; case MOVE_SWIM: - data.Initialize(SMSG_MOVE_SPLINE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_SWIM_SPEED, 1 + 8 + 4); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[7]); + data << float(GetSpeed(mtype)); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[5]); break; case MOVE_SWIM_BACK: - data.Initialize(SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED, 1 + 8 + 4); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[7]); + + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[2]); + data << float(GetSpeed(mtype)); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[5]); break; case MOVE_TURN_RATE: - data.Initialize(SMSG_MOVE_SPLINE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_TURN_RATE, 1 + 8 + 4); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[2]); + + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[0]); + data << float(GetSpeed(mtype)); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[3]); break; case MOVE_FLIGHT: - data.Initialize(SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED, 1 + 8 + 4); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[1]); + + data << float(GetSpeed(mtype)); + + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[4]); break; case MOVE_FLIGHT_BACK: - data.Initialize(SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED, 1 + 8 + 4); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[3]); + + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[7]); + data << float(GetSpeed(mtype)); + data.WriteByteSeq(bytes[3]); break; case MOVE_PITCH_RATE: - data.Initialize(SMSG_MOVE_SPLINE_SET_PITCH_RATE, 8+4+2+4+4+4+4+4+4+4); + data.Initialize(SMSG_MOVE_SPLINE_SET_PITCH_RATE, 1 + 8 + 4); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[1]); + + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[4]); + data << float(GetSpeed(mtype)); break; default: sLog->outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.", mtype); @@ -16842,13 +16970,33 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ) float vcos, vsin; GetSinCos(x, y, vsin, vcos); - WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8+4+4+4+4+4)); - data.append(GetPackGUID()); - data << uint32(0); // counter - data << float(vcos); // x direction - data << float(vsin); // y direction - data << float(speedXY); // Horizontal speed - data << float(-speedZ); // Z Movement speed (vertical) + WorldPacket data(SMSG_MOVE_KNOCK_BACK, (1+8+4+4+4+4+4)); + uint64 guid = GetGUID(); + uint8* bytes = (uint8*)&guid; + + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[7]); + + data.WriteByteSeq(bytes[0]); + data << float(speedXY); + data << uint32(0); + data << float(-speedZ); + data.WriteByteSeq(bytes[6]); + data << float(vcos); + data << float(vsin); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[5]); player->GetSession()->SendPacket(&data); } @@ -17162,13 +17310,32 @@ void Unit::JumpTo(float speedXY, float speedZ, bool forward) float vcos = cos(angle+GetOrientation()); float vsin = sin(angle+GetOrientation()); - WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8+4+4+4+4+4)); - data.append(GetPackGUID()); - data << uint32(0); // Sequence - data << float(vcos); // x direction - data << float(vsin); // y direction - data << float(speedXY); // Horizontal speed - data << float(-speedZ); // Z Movement speed (vertical) + WorldPacket data(SMSG_MOVE_KNOCK_BACK, (1+8+4+4+4+4+4)); + uint64 guid = GetGUID(); + uint8* bytes = (uint8*)&guid; + + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[7]); + + data.WriteByteSeq(bytes[0]); + data << float(speedXY); + data << uint32(0); + data << float(-speedZ); + data.WriteByteSeq(bytes[6]); + data << float(vcos); + data << float(vsin); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[5]); ToPlayer()->GetSession()->SendPacket(&data); } diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 9fc220e600a..00832aa4d59 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -60,6 +60,7 @@ public: { "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL }, { "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL }, { "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL }, + { "collision", SEC_GAMEMASTER, false, &HandleModifyCollisionCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = @@ -1374,6 +1375,88 @@ public: return true; } + + static bool HandleModifyCollisionCommand(ChatHandler* handler, const char* args) + { + if (!*args) + return false; + + Player* target = handler->getSelectedPlayer(); + + if (!target) + { + handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + std::string param = (char*)args; + + if (param == "on") + { + // enable collision + WorldPacket data; + uint64 guid = target->GetGUID(); + uint8* bytes = (uint8*)&guid; + + data.Initialize(SMSG_MOVE_SPLINE_ENABLE_COLLISION, 1 + 8); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[0]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[3]); + + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[2]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[0]); + + target->SendMessageToSet(&data, true); + handler->SendSysMessage("Enabled Collision"); + return true; + } + + if (param == "off") + { + // disable collision + WorldPacket data; + uint64 guid = target->GetGUID(); + uint8* bytes = (uint8*)&guid; + + data.Initialize(SMSG_MOVE_SPLINE_DISABLE_COLLISION, 1 + 8); + data.WriteByteMask(bytes[4]); + data.WriteByteMask(bytes[7]); + data.WriteByteMask(bytes[5]); + data.WriteByteMask(bytes[3]); + data.WriteByteMask(bytes[2]); + data.WriteByteMask(bytes[1]); + data.WriteByteMask(bytes[6]); + data.WriteByteMask(bytes[0]); + + data.WriteByteSeq(bytes[6]); + data.WriteByteSeq(bytes[0]); + data.WriteByteSeq(bytes[5]); + data.WriteByteSeq(bytes[4]); + data.WriteByteSeq(bytes[7]); + data.WriteByteSeq(bytes[3]); + data.WriteByteSeq(bytes[1]); + data.WriteByteSeq(bytes[2]); + + target->SendMessageToSet(&data, true); + handler->SendSysMessage("Disabled Collision"); + return true; + } + + return false; + } + }; void AddSC_modify_commandscript() |