Removed all TODO's in project (#831)

* removed the rest of the magic number errors from d2game

* hotfix for bug i added in map engine test

* removed all TODO's in project, made issues on github for each one
This commit is contained in:
gravestench 2020-10-25 22:36:12 +00:00 committed by GitHub
parent 8e957c17fe
commit 025ee94e50
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 43 additions and 59 deletions

View File

@ -4,7 +4,7 @@ package d2enum
type NPCActionType int type NPCActionType int
// NPCAction types // NPCAction types
// TODO: Figure out what 1-3 are for // https://github.com/OpenDiablo2/OpenDiablo2/issues/811
const ( const (
NPCActionInvalid NPCActionType = iota NPCActionInvalid NPCActionType = iota
NPCAction1 NPCAction1

View File

@ -192,7 +192,7 @@ func (v *DCCDirection) generateFrames(pcd *d2datautils.BitMuncher) {
if (pbe.Frame != frameIndex) || (pbe.FrameCellIndex != c) { if (pbe.Frame != frameIndex) || (pbe.FrameCellIndex != c) {
// This buffer cell has an EqualCell bit set to 1, so copy the frame cell or clear it // This buffer cell has an EqualCell bit set to 1, so copy the frame cell or clear it
if (cell.Width != bufferCell.LastWidth) || (cell.Height != bufferCell.LastHeight) { if (cell.Width != bufferCell.LastWidth) || (cell.Height != bufferCell.LastHeight) {
// Different sizes TODO: Clear the pixels of the frame cell // Different sizes
for y := 0; y < cell.Height; y++ { for y := 0; y < cell.Height; y++ {
for x := 0; x < cell.Width; x++ { for x := 0; x < cell.Width; x++ {
v.PixelData[x+cell.XOffset+((y+cell.YOffset)*v.Box.Width)] = 0 v.PixelData[x+cell.XOffset+((y+cell.YOffset)*v.Box.Width)] = 0

View File

@ -192,7 +192,7 @@ func (v *MPQ) loadHashTable() error {
v.hashEntryMap.Insert(&HashTableEntry{ v.hashEntryMap.Insert(&HashTableEntry{
NamePartA: hashData[i*4], NamePartA: hashData[i*4],
NamePartB: hashData[(i*4)+1], NamePartB: hashData[(i*4)+1],
//nolint:godox // TODO: Verify that we're grabbing the right high/lo word for the vars below // https://github.com/OpenDiablo2/OpenDiablo2/issues/812
Locale: uint16(hashData[(i*4)+2] >> 16), //nolint:gomnd binary data Locale: uint16(hashData[(i*4)+2] >> 16), //nolint:gomnd binary data
Platform: uint16(hashData[(i*4)+2] & 0xFFFF), //nolint:gomnd binary data Platform: uint16(hashData[(i*4)+2] & 0xFFFF), //nolint:gomnd binary data
BlockIndex: hashData[(i*4)+3], BlockIndex: hashData[(i*4)+3],

View File

@ -34,7 +34,6 @@ type Animation interface {
SetPlayLoop(loop bool) SetPlayLoop(loop bool)
SetPlaySpeed(playSpeed float64) SetPlaySpeed(playSpeed float64)
SetPlayLength(playLength float64) SetPlayLength(playLength float64)
SetPlayLengthMs(playLengthMs int)
SetColorMod(colorMod color.Color) SetColorMod(colorMod color.Color)
GetPlayedCount() int GetPlayedCount() int
ResetPlayedCount() ResetPlayedCount()

View File

@ -51,7 +51,7 @@ type Animation struct {
lastFrameTime float64 lastFrameTime float64
playedCount int playedCount int
playMode playMode playMode playMode
playLength float64 playLength float64 // https://github.com/OpenDiablo2/OpenDiablo2/issues/813
subStartingFrame int subStartingFrame int
subEndingFrame int subEndingFrame int
originAtBottom bool originAtBottom bool
@ -367,19 +367,11 @@ func (a *Animation) SetPlaySpeed(playSpeed float64) {
// SetPlayLength sets the Animation's play length in seconds // SetPlayLength sets the Animation's play length in seconds
func (a *Animation) SetPlayLength(playLength float64) { func (a *Animation) SetPlayLength(playLength float64) {
// TODO refactor to use time.Duration instead of float64 // https://github.com/OpenDiablo2/OpenDiablo2/issues/813
a.playLength = playLength a.playLength = playLength
a.lastFrameTime = 0 a.lastFrameTime = 0
} }
// SetPlayLengthMs sets the Animation's play length in milliseconds
func (a *Animation) SetPlayLengthMs(playLengthMs int) {
// TODO remove this method
const millisecondsPerSecond = 1000.0
a.SetPlayLength(float64(playLengthMs) / millisecondsPerSecond)
}
// SetColorMod sets the Animation's color mod // SetColorMod sets the Animation's color mod
func (a *Animation) SetColorMod(colorMod color.Color) { func (a *Animation) SetColorMod(colorMod color.Color) {
a.colorMod = colorMod a.colorMod = colorMod

View File

@ -131,7 +131,6 @@ func (f *HeroStateFactory) CreateHeroSkillsState(classStats *d2records.CharStats
} }
} }
skillRecord, err := f.CreateHeroSkill(1, "Attack") skillRecord, err := f.CreateHeroSkill(1, "Attack")
if err != nil { if err != nil {
return nil, err return nil, err
@ -158,7 +157,7 @@ func (f *HeroStateFactory) CreateHeroSkill(points int, name string) (*HeroSkill,
SkillPoints: points, SkillPoints: points,
SkillRecord: skillRecord, SkillRecord: skillRecord,
SkillDescriptionRecord: skillDescRecord, SkillDescriptionRecord: skillDescRecord,
shallow: &shallowHeroSkill{SkillID: skillRecord.ID, SkillPoints: points}, shallow: &shallowHeroSkill{SkillID: skillRecord.ID, SkillPoints: points},
} }
return result, nil return result, nil
@ -200,7 +199,6 @@ func (f *HeroStateFactory) LoadHeroState(filePath string) *HeroState {
for idx := range result.Skills { for idx := range result.Skills {
hs := result.Skills[idx] hs := result.Skills[idx]
// TODO: figure out why this can be nil
if hs == nil { if hs == nil {
continue continue
} }

View File

@ -48,14 +48,14 @@ func (f *HeroStateFactory) CreateHeroStatsState(heroClass d2enum.Hero, classStat
MaxHealth: classStats.InitVit * classStats.LifePerVit, MaxHealth: classStats.InitVit * classStats.LifePerVit,
MaxMana: classStats.InitEne * classStats.ManaPerEne, MaxMana: classStats.InitEne * classStats.ManaPerEne,
MaxStamina: classStats.InitStamina, MaxStamina: classStats.InitStamina,
// TODO: chance to hit, defense rating // https://github.com/OpenDiablo2/OpenDiablo2/issues/814
} }
result.Mana = result.MaxMana result.Mana = result.MaxMana
result.Health = result.MaxHealth result.Health = result.MaxHealth
result.Stamina = float64(result.MaxStamina) result.Stamina = float64(result.MaxStamina)
// TODO: For demonstration purposes (hp, mana, exp, & character stats panel gets updated depending on stats) // https://github.com/OpenDiablo2/OpenDiablo2/issues/815
result.Health = 50 result.Health = 50
result.Mana = 30 result.Mana = 30
result.Experience = 166 result.Experience = 166

View File

@ -441,7 +441,8 @@ func (i *Item) generateProperties(pool PropertyPool) {
if generated := i.generateSetItemProperties(); generated != nil { if generated := i.generateSetItemProperties(); generated != nil {
props = generated props = generated
} }
case PropertyPoolSet: // todo set bonus handling, needs player/equipment context case PropertyPoolSet:
// https://github.com/OpenDiablo2/OpenDiablo2/issues/817
} }
if props == nil { if props == nil {

View File

@ -388,7 +388,7 @@ func (f *ItemFactory) resolveDynamicTreasureCode(code string) []*d2records.ItemC
stringComponent := getStringComponent(code) stringComponent := getStringComponent(code)
if stringComponent == goldItemCodeWithMult { if stringComponent == goldItemCodeWithMult {
// todo need to do something with the numeric component (the gold multiplier) // need to do something with the numeric component (the gold multiplier)
stringComponent = goldItemCode stringComponent = goldItemCode
} }

View File

@ -354,7 +354,7 @@ func (p *Property) fnClassSkills(
// fnStateApplyToTarget property applied to character or target monster ??? // fnStateApplyToTarget property applied to character or target monster ???
func (p *Property) fnStateApplyToTarget(iscRecord *d2records.ItemStatCostRecord) d2stats.Stat { func (p *Property) fnStateApplyToTarget(iscRecord *d2records.ItemStatCostRecord) d2stats.Stat {
// todo need to implement states // https://github.com/OpenDiablo2/OpenDiablo2/issues/818
return nil return nil
} }

View File

@ -33,7 +33,7 @@ func (co *CastOverlay) GetVelocity() d2vector.Vector {
// SetRadians adjusts the entity target based on it's range, rotating it's // SetRadians adjusts the entity target based on it's range, rotating it's
// current destination by the value of angle in radians. // current destination by the value of angle in radians.
func (co *CastOverlay) SetRadians(angle float64, done func()) { func (co *CastOverlay) SetRadians(angle float64, done func()) {
rads := float64(co.record.Height2) // TODO: rads := float64(co.record.Height2)
x := co.Position.X() + (rads * math.Cos(angle)) x := co.Position.X() + (rads * math.Cos(angle))
y := co.Position.Y() + (rads * math.Sin(angle)) y := co.Position.Y() + (rads * math.Sin(angle))

View File

@ -43,7 +43,7 @@ func (m *Missile) SetRadians(angle float64, done func()) {
// Advance is called once per frame and processes a // Advance is called once per frame and processes a
// single game tick. // single game tick.
func (m *Missile) Advance(tickTime float64) { func (m *Missile) Advance(tickTime float64) {
// TODO: collision detection // https://github.com/OpenDiablo2/OpenDiablo2/issues/819
m.Step(tickTime) m.Step(tickTime)
m.AnimatedEntity.Advance(tickTime) m.AnimatedEntity.Advance(tickTime)
} }

View File

@ -254,7 +254,7 @@ func (p *Player) GetVelocity() d2vector.Vector {
// GetSize returns the current frame size // GetSize returns the current frame size
func (p *Player) GetSize() (width, height int) { func (p *Player) GetSize() (width, height int) {
width, height = p.composite.GetSize() width, height = p.composite.GetSize()
// todo: we need to get full size of composite animations, currently only gets legs // https://github.com/OpenDiablo2/OpenDiablo2/issues/820
height = (height * 2) - (height / 2) height = (height * 2) - (height / 2)
return width, height return width, height

View File

@ -124,7 +124,7 @@ func (mr *MapRenderer) SetMapEngine(mapEngine *d2mapengine.MapEngine) {
// //
// Pass 4: Roof tiles. // Pass 4: Roof tiles.
func (mr *MapRenderer) Render(target d2interface.Surface) { func (mr *MapRenderer) Render(target d2interface.Surface) {
// TODO:(temp hack) should not render before the map has been fully generated - // https://github.com/OpenDiablo2/OpenDiablo2/issues/789
// Prevents concurrent map read & write exceptions that otherwise occur when we join a TCP game // Prevents concurrent map read & write exceptions that otherwise occur when we join a TCP game
// as a remote client, due to rendering before we have handled the GenerateMapPacket. // as a remote client, due to rendering before we have handled the GenerateMapPacket.
if mr.mapEngine.IsLoading { if mr.mapEngine.IsLoading {
@ -208,7 +208,8 @@ func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, e
tileEnt := make([]d2interface.MapEntity, 0) tileEnt := make([]d2interface.MapEntity, 0)
// TODO: Do not loop over every entity every frame // need to add render culling
// https://github.com/OpenDiablo2/OpenDiablo2/issues/821
for _, mapEntity := range mr.mapEngine.Entities() { for _, mapEntity := range mr.mapEngine.Entities() {
pos := mapEntity.GetPosition() pos := mapEntity.GetPosition()
vec := pos.World() vec := pos.World()
@ -255,7 +256,8 @@ func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, e
tileEnt := make([]d2interface.MapEntity, 0) tileEnt := make([]d2interface.MapEntity, 0)
// TODO: Do not loop over every entity every frame // need to add render culling
// https://github.com/OpenDiablo2/OpenDiablo2/issues/821
for _, mapEntity := range mr.mapEngine.Entities() { for _, mapEntity := range mr.mapEngine.Entities() {
pos := mapEntity.GetPosition() pos := mapEntity.GetPosition()
vec := pos.World() vec := pos.World()

View File

@ -13,7 +13,7 @@ func skillDescriptionLoader(r *RecordManager, d *d2txt.DataDictionary) error {
records := make(map[string]*SkillDescriptionRecord) records := make(map[string]*SkillDescriptionRecord)
parser := d2parser.New() parser := d2parser.New()
parser.SetCurrentReference("skill", "TODO: connect skill with description!") //nolint:godox // TODO: Connect skill with description. parser.SetCurrentReference("skill", "TODO: connect skill with description!")
for d.Next() { for d.Next() {
record := &SkillDescriptionRecord{ record := &SkillDescriptionRecord{

View File

@ -192,7 +192,7 @@ func (s *ebitenSurface) handleStateEffect(opts *ebiten.DrawImageOptions) {
opts.ColorM.Translate(0, 0, 0, -transparency75) opts.ColorM.Translate(0, 0, 0, -transparency75)
case d2enum.DrawEffectModulate: case d2enum.DrawEffectModulate:
opts.CompositeMode = ebiten.CompositeModeLighter opts.CompositeMode = ebiten.CompositeModeLighter
// TODO: idk what to do when ebiten doesn't exactly match, pick closest? // https://github.com/OpenDiablo2/OpenDiablo2/issues/822
case d2enum.DrawEffectBurn: case d2enum.DrawEffectBurn:
case d2enum.DrawEffectNormal: case d2enum.DrawEffectNormal:
case d2enum.DrawEffectMod2XTrans: case d2enum.DrawEffectMod2XTrans:

View File

@ -173,7 +173,7 @@ func (v *Label) getAlignOffset(textWidth int) int {
} }
func getColor(token ColorToken) color.Color { func getColor(token ColorToken) color.Color {
// todo this should really come from the PL2 files // https://github.com/OpenDiablo2/OpenDiablo2/issues/823
colors := map[ColorToken]color.Color{ colors := map[ColorToken]color.Color{
ColorTokenGrey: d2util.Color(colorGrey100Alpha), ColorTokenGrey: d2util.Color(colorGrey100Alpha),
ColorTokenWhite: d2util.Color(colorWhite100Alpha), ColorTokenWhite: d2util.Color(colorWhite100Alpha),

View File

@ -186,11 +186,6 @@ func (s *Sprite) SetPlayLength(playLength float64) {
s.animation.SetPlayLength(playLength) s.animation.SetPlayLength(playLength)
} }
// SetPlayLengthMs sets the play length of the sprite animation in milliseconds
func (s *Sprite) SetPlayLengthMs(playLengthMs int) {
s.animation.SetPlayLengthMs(playLengthMs)
}
// SetColorMod sets the color modifier // SetColorMod sets the color modifier
func (s *Sprite) SetColorMod(c color.Color) { func (s *Sprite) SetColorMod(c color.Color) {
s.animation.SetColorMod(c) s.animation.SetColorMod(c)

View File

@ -17,9 +17,9 @@ type UIManager struct {
inputManager d2interface.InputManager inputManager d2interface.InputManager
audio d2interface.AudioProvider audio d2interface.AudioProvider
widgets []Widget widgets []Widget
cursorButtons CursorButton // TODO (carrelld) convert dependent code and remove cursorButtons CursorButton
CursorX int // TODO (carrelld) convert dependent code and remove CursorX int
CursorY int // TODO (carrelld) convert dependent code and remove CursorY int
pressedWidget Widget pressedWidget Widget
clickSfx d2interface.SoundEffect clickSfx d2interface.SoundEffect
} }

View File

@ -776,7 +776,7 @@ func (v *SelectHeroClass) loadSprite(animationPath string, position image.Point,
} }
if playLength != 0 { if playLength != 0 {
sprite.SetPlayLengthMs(playLength) sprite.SetPlayLength(float64(playLength) / 1000.0)
} }
sprite.SetPosition(position.X, position.Y) sprite.SetPosition(position.X, position.Y)

View File

@ -92,7 +92,6 @@ func (l *LocalClientConnection) Close() error {
// SendPacketToServer calls d2server.OnPacketReceived with the given packet. // SendPacketToServer calls d2server.OnPacketReceived with the given packet.
func (l *LocalClientConnection) SendPacketToServer(packet d2netpacket.NetPacket) error { func (l *LocalClientConnection) SendPacketToServer(packet d2netpacket.NetPacket) error {
// TODO: This is going to blow up if the server has ceased to be.
return d2server.OnPacketReceived(l, packet) return d2server.OnPacketReceived(l, packet)
} }

View File

@ -50,16 +50,13 @@ func (r *RemoteClientConnection) Open(connectionString, saveFilePath string) err
connectionString += ":6669" connectionString += ":6669"
} }
// TODO: Connect to the server
tcpAddress, err := net.ResolveTCPAddr("tcp", connectionString) tcpAddress, err := net.ResolveTCPAddr("tcp", connectionString)
// TODO: Show connection error screen if connection fails
if err != nil { if err != nil {
return err return err
} }
r.tcpConnection, err = net.DialTCP("tcp", nil, tcpAddress) r.tcpConnection, err = net.DialTCP("tcp", nil, tcpAddress)
// TODO: Show connection error screen if connection fails
if err != nil { if err != nil {
return err return err
} }

View File

@ -9,7 +9,7 @@ import (
// MovePlayerPacket contains a movement command for a specific player entity. // MovePlayerPacket contains a movement command for a specific player entity.
// It is sent by the server to move a player entity on a client. // It is sent by the server to move a player entity on a client.
// TODO: Need to handle being on different maps // https://github.com/OpenDiablo2/OpenDiablo2/issues/825
type MovePlayerPacket struct { type MovePlayerPacket struct {
PlayerID string `json:"playerId"` PlayerID string `json:"playerId"`
StartX float64 `json:"startX"` StartX float64 `json:"startX"`

View File

@ -10,7 +10,6 @@ import (
// CastPacket contains a cast command for an entity. It is sent by the server // CastPacket contains a cast command for an entity. It is sent by the server
// and instructs the client to trigger the use of the given skill on the given // and instructs the client to trigger the use of the given skill on the given
// entity. // entity.
// TODO: Need to handle being on different maps
type CastPacket struct { type CastPacket struct {
SourceEntityID string `json:"sourceEntityId"` SourceEntityID string `json:"sourceEntityId"`
SkillID int `json:"skillId"` SkillID int `json:"skillId"`
@ -27,7 +26,7 @@ func CreateCastPacket(entityID string, skillID int, targetX, targetY float64) Ne
SkillID: skillID, SkillID: skillID,
TargetX: targetX, TargetX: targetX,
TargetY: targetY, TargetY: targetY,
TargetEntityID: "", // TODO implement targeting entities TargetEntityID: "", // https://github.com/OpenDiablo2/OpenDiablo2/issues/826
} }
b, err := json.Marshal(castPacket) b, err := json.Marshal(castPacket)

View File

@ -13,7 +13,7 @@ import (
// It is sent by a remote client to close the connection (leave a game). // It is sent by a remote client to close the connection (leave a game).
type PlayerDisconnectRequestPacket struct { type PlayerDisconnectRequestPacket struct {
ID string `json:"id"` ID string `json:"id"`
PlayerState *d2hero.HeroState `json:"gameState"` // TODO: remove this? It isn't used. PlayerState *d2hero.HeroState `json:"gameState"`
} }
// CreatePlayerDisconnectRequestPacket returns a NetPacket which defines a // CreatePlayerDisconnectRequestPacket returns a NetPacket which defines a

View File

@ -52,6 +52,7 @@ type GameServer struct {
packetManagerChan chan []byte packetManagerChan chan []byte
} }
// https://github.com/OpenDiablo2/OpenDiablo2/issues/824
//nolint:gochecknoglobals // currently singleton by design //nolint:gochecknoglobals // currently singleton by design
var singletonServer *GameServer var singletonServer *GameServer
@ -82,8 +83,7 @@ func NewGameServer(asset *d2asset.AssetManager, networkServer bool,
seed: time.Now().UnixNano(), seed: time.Now().UnixNano(),
} }
// TODO: In order to support dedicated mode we need to load the levels txt and files. Revisit this once this we can // https://github.com/OpenDiablo2/OpenDiablo2/issues/827
// load files independent of the app.
mapEngine := d2mapengine.CreateMapEngine(asset) mapEngine := d2mapengine.CreateMapEngine(asset)
mapEngine.SetSeed(gameServer.seed) mapEngine.SetSeed(gameServer.seed)
mapEngine.ResetMap(d2enum.RegionAct1Town, 100, 100) mapEngine.ResetMap(d2enum.RegionAct1Town, 100, 100)
@ -105,8 +105,7 @@ func NewGameServer(asset *d2asset.AssetManager, networkServer bool,
return val return val
}) })
// TODO: Temporary hack to work around local connections. Possible that we can move away from the singleton pattern here // https://github.com/OpenDiablo2/OpenDiablo2/issues/824
// but for now this will work.
singletonServer = gameServer singletonServer = gameServer
return gameServer, nil return gameServer, nil
@ -245,11 +244,10 @@ func (g *GameServer) handleConnection(conn net.Conn) {
log.Printf("Closing connection with %s: did not receive new player connection request...\n", conn.RemoteAddr().String()) log.Printf("Closing connection with %s: did not receive new player connection request...\n", conn.RemoteAddr().String())
} }
// TODO: I do not think this error check actually works. Need to retrofit with Errors.Is().
if err := g.registerConnection(packet.PacketData, conn); err != nil { if err := g.registerConnection(packet.PacketData, conn); err != nil {
switch err { switch err {
case errServerFull: // Server is currently full and not accepting new connections. case errServerFull: // Server is currently full and not accepting new connections.
// TODO: Need to create a new Server Full packet to return to clients. // https://github.com/OpenDiablo2/OpenDiablo2/issues/828
log.Println(err) log.Println(err)
return return
case errPlayerAlreadyExists: // Player is already registered and did not disconnection correctly. case errPlayerAlreadyExists: // Player is already registered and did not disconnection correctly.
@ -301,7 +299,8 @@ func (g *GameServer) registerConnection(b []byte, conn net.Conn) error {
g.connections[client.GetUniqueID()] = client g.connections[client.GetUniqueID()] = client
// Temporary position hack -------------------------------------------- // Temporary position hack --------------------------------------------
sx, sy := g.mapEngines[0].GetStartPosition() // TODO: Another temporary hack // https://github.com/OpenDiablo2/OpenDiablo2/issues/829
sx, sy := g.mapEngines[0].GetStartPosition()
clientPlayerState := client.GetPlayerState() clientPlayerState := client.GetPlayerState()
clientPlayerState.X = sx clientPlayerState.X = sx
clientPlayerState.Y = sy clientPlayerState.Y = sy
@ -325,7 +324,8 @@ func (g *GameServer) registerConnection(b []byte, conn net.Conn) error {
// For more information, see d2networking.d2netpacket. // For more information, see d2networking.d2netpacket.
func OnClientConnected(client ClientConnection) { func OnClientConnected(client ClientConnection) {
// Temporary position hack -------------------------------------------- // Temporary position hack --------------------------------------------
sx, sy := singletonServer.mapEngines[0].GetStartPosition() // TODO: Another temporary hack // https://github.com/OpenDiablo2/OpenDiablo2/issues/829
sx, sy := singletonServer.mapEngines[0].GetStartPosition()
clientPlayerState := client.GetPlayerState() clientPlayerState := client.GetPlayerState()
clientPlayerState.X = sx clientPlayerState.X = sx
clientPlayerState.Y = sy clientPlayerState.Y = sy
@ -408,15 +408,17 @@ func OnClientDisconnected(client ClientConnection) {
// OnPacketReceived is called by the local client to 'send' a packet to the server. // OnPacketReceived is called by the local client to 'send' a packet to the server.
func OnPacketReceived(client ClientConnection, packet d2netpacket.NetPacket) error { func OnPacketReceived(client ClientConnection, packet d2netpacket.NetPacket) error {
if singletonServer == nil {
return errors.New("singleton server is nil")
}
switch packet.PacketType { switch packet.PacketType {
case d2netpackettype.MovePlayer: case d2netpackettype.MovePlayer:
movePacket, err := d2netpacket.UnmarshalMovePlayer(packet.PacketData) movePacket, err := d2netpacket.UnmarshalMovePlayer(packet.PacketData)
if err != nil { if err != nil {
return err return err
} }
// TODO: This needs to be verified on the server (here) before sending to other clients.... // https://github.com/OpenDiablo2/OpenDiablo2/issues/830
// TODO: Hacky, this should be updated in realtime ----------------
// TODO: Verify player id
playerState := singletonServer.connections[client.GetUniqueID()].GetPlayerState() playerState := singletonServer.connections[client.GetUniqueID()].GetPlayerState()
playerState.X = movePacket.DestX playerState.X = movePacket.DestX
playerState.Y = movePacket.DestY playerState.Y = movePacket.DestY