mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-04 15:46:51 -05:00
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:
parent
8e957c17fe
commit
025ee94e50
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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],
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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{
|
||||||
|
@ -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:
|
||||||
|
@ -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),
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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"`
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user