// doLogin authenticates the user, sends the login response, and sets up the client for standard packet processing func (svc *GameService) doLogin(client player.Player, username, password string) error { profile, responseCode := svc.auth.LookupProfile(username, password) if responseCode != auth.AuthOkay { client.Conn().Write <- &game_protocol.OutboundLoginResponseUnsuccessful{ Response: encoding.Uint8(responseCode), } client.Conn().Disconnect() return nil } client.SetProfile(profile.(player.Profile)) // Successful login, do all the stuff client.Conn().Write <- &game_protocol.OutboundLoginResponse{ Response: encoding.Uint8(responseCode), Rights: encoding.Uint8(client.Profile().Rights()), Flagged: 0, } client.SetDecodeFunc(svc.decodePacket) go svc.packetConsumer(client) game_event.PlayerLogin.NotifyObservers(client) client.LoadProfile() game_event.PlayerFinishLogin.NotifyObservers(client) go func() { client.Conn().WaitForDisconnect() game_event.PlayerLogout.NotifyObservers(client) }() return nil }
func (struc *PlayerUpdateBlock) buildUpdateBlock(w io.Writer, thisPlayer player.Player) error { flags := thisPlayer.Flags() & ^entity.MobFlagMovementUpdate if flags == 0 { return nil } if flags >= 256 { flags |= 64 flagsEnc := encoding.Uint16(flags) err := flagsEnc.Encode(w, encoding.IntLittleEndian) if err != nil { return err } } else { flagsEnc := encoding.Uint8(flags) err := flagsEnc.Encode(w, encoding.IntNilFlag) if err != nil { return err } } /* Update appearance */ if (flags & entity.MobFlagIdentityUpdate) != 0 { buf := encoding.NewBuffer() appearance := thisPlayer.Profile().Appearance() anims := thisPlayer.Animations() appearanceBlock := OutboundPlayerAppearance{ Gender: encoding.Uint8(appearance.Gender()), HeadIcon: encoding.Uint8(appearance.HeadIcon()), HelmModel: encoding.Uint8(0), CapeModel: encoding.Uint8(0), AmuletModel: encoding.Uint8(0), RightWieldModel: encoding.Uint8(0), TorsoModel: encoding.Uint16(256 + appearance.Model(player.Torso)), LeftWieldModel: encoding.Uint8(0), ArmsModel: encoding.Uint16(256 + appearance.Model(player.Arms)), LegsModel: encoding.Uint16(256 + appearance.Model(player.Legs)), HeadModel: encoding.Uint16(256 + appearance.Model(player.Head)), HandsModel: encoding.Uint16(256 + appearance.Model(player.Hands)), FeetModel: encoding.Uint16(256 + appearance.Model(player.Feet)), BeardModel: encoding.Uint16(256 + appearance.Model(player.Beard)), HairColor: encoding.Uint8(appearance.Color(player.Hair)), TorsoColor: encoding.Uint8(appearance.Color(player.Torso)), LegColor: encoding.Uint8(appearance.Color(player.Legs)), FeetColor: encoding.Uint8(appearance.Color(player.Feet)), SkinColor: encoding.Uint8(appearance.Color(player.Skin)), AnimIdle: encoding.Uint16(anims.Animation(player.AnimIdle)), AnimSpotRotate: encoding.Uint16(anims.Animation(player.AnimSpotRotate)), AnimWalk: encoding.Uint16(anims.Animation(player.AnimWalk)), AnimRotate180: encoding.Uint16(anims.Animation(player.AnimRotate180)), AnimRotateCCW: encoding.Uint16(anims.Animation(player.AnimRotateCCW)), AnimRotateCW: encoding.Uint16(anims.Animation(player.AnimRotateCW)), AnimRun: encoding.Uint16(anims.Animation(player.AnimRun)), } err := appearanceBlock.Encode(buf, nil) if err != nil { return err } block := buf.Bytes() blockSize := encoding.Uint8(len(block)) err = blockSize.Encode(w, encoding.IntNegate) if err != nil { return err } _, err = w.Write(block) if err != nil { return err } } return nil }