-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
character.go
107 lines (83 loc) · 2.23 KB
/
character.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package world
import (
"encoding/binary"
"github.com/paalgyula/summit/pkg/summit/world/basedata"
"github.com/paalgyula/summit/pkg/summit/world/object/player"
"github.com/paalgyula/summit/pkg/wow"
"github.com/rs/zerolog/log"
)
func (gc *WorldSession) SendCharacterEnum() {
var players player.Players
if err := gc.ws.GetCharacters(gc.AccountName, &players); err != nil {
log.Error().Err(err).Msg("cannot get players from database")
}
for _, p := range players {
p.Init()
}
pkt := wow.NewPacket(wow.ServerCharEnum)
// Character list size, this should be replaced
_ = pkt.WriteOne(len(players))
for _, p := range players {
p.ToCharacterEnum(pkt)
}
gc.socket.Send(pkt)
}
type CharacterCreateRequest struct {
Race wow.PlayerRace
Class wow.PlayerClass
Gender wow.PlayerGender
Skin uint8
Face uint8
HairStyle uint8
HairColor uint8
FacialHair uint8
OutfitID uint8
}
type CharacterCreateResult uint8
//nolint:godox
func (gc *WorldSession) CreateCharacter(data wow.PacketData) {
r := wow.NewPacketReader(data)
var characerName string
_ = r.ReadString(&characerName)
var req CharacterCreateRequest
_ = r.Read(&req, binary.BigEndian)
pci := basedata.GetInstance().
LookupCharacterCreateInfo(req.Race, req.Class, req.Gender)
loc := player.WorldLocation{
X: pci.X,
Y: pci.Y,
Z: pci.Z,
O: pci.O,
Map: pci.Map,
Zone: pci.Zone,
}
//nolint:exhaustruct
p := player.Player{
Name: characerName,
Race: req.Race,
Class: req.Class,
Gender: req.Gender,
Skin: req.Skin,
Face: req.Face,
HairStyle: req.HairStyle,
HairColor: req.HairColor,
FacialHair: req.FacialHair,
OutfitID: req.OutfitID,
Location: loc,
BindLocation: loc,
Level: 1,
GuildID: 0x200000,
CharFlags: 0x00,
Recustomization: 0,
FirstLogin: 1,
Pet: player.Pet{},
}
p.InitInventory(pci.Inventory)
// TODO: error check
_ = gc.ws.CreateCharacter(gc.AccountName, &p)
status := []byte{0x00} // OK :)
pkt := wow.NewPacketWithData(wow.ServerCharCreate, status)
// Send response, then the new character list
gc.socket.Send(pkt)
gc.SendCharacterEnum()
}