天堂开发笔记(三)

开发记录

角色登入

选择角色进入游戏并能走动(处理来自客户端的登入请求C_OPCODE_LOGINTOSERVER = 55 # 請求登錄角色)

Nov 17, 2016 10:40:21 AM l1j.server.server.ClientThread run
INFO: [Recv C]
0000: 37 54 65 73 74 00 f0 37                            7Test..7              C_OPCODE_LOGINTOSERVER

Nov 17, 2016 10:40:21 AM l1j.server.server.clientpackets.C_LoginToServer <init>
INFO: 【進入遊戲】 角色名稱:Test 玩家帳號:fwdssg 玩家IP:192.168.30.192
[Send C]:
0000: 79 04 00 00 04 00 00 00                            y.......              S_OPCODE_HOUSEMAP

[Send C]:
0000: 29 03 00 f7 ad 74 00 e5                            )....t..              S_OPCODE_LOGINTOGAME

[Send C]:

[Send C]:
0000: 64 14 69                                           d.i                   S_OPCODE_PACKETBOX

[Send C]:
0000: 64 57 00 00 00 00 00 00                            dW......             S_OPCODE_PACKETBOX

[Send C]:
0000: 22 c5 42 2f 13 01 00 00 00 00 10 08 09 0c 12 0c    ".B/............      S_OPCODE_OWNCHARSTATUS
0010: 10 00 10 00 01 00 01 00 0a 44 f3 f5 96 28 00 00    .........D...(..
0020: 00 00 00 00 00                                     .....

[Send C]:
0000: 20 45 00 00 00 00 00 00 00 00 00 00                 E..........          S_OPCODE_MAPID

[Send C]:
0000: 37 ca 7f 6d 80 c5 42 2f 13 3d 00 00 05 00 00 00    7.m..B/.=......       S_OPCODE_CHARPACK
0010: 00 00 00 00 00 54 65 73 74 00 00 04 00 00 00 00    .....Test.......
0020: 00 00 00 ff 00 00 00 ff ff                         .........

[Send C]:
0000: 53 00 00 00                                        S...                  S_OPCODE_SPMR

[Send C]:
0000: 6c c5 42 2f 13 00 00 00                            l.B/....              S_OPCODE_CHARTITLE

[Send C]:
0000: 4f 04 00 00                                        O...                  S_OPCODE_WEATHER

[Send C]:
0000: 45 0c c6 42 2f 13 ff 00 05 00 01 20 a1 07 00 00    E..B/...... ....      S_OPCODE_INVLIST
0010: bd f0 b1 d2 20 28 35 30 30 30 30 30 29 00 00 c7    .... (500000)...
0020: 42 2f 13 00 00 1a 07 01 e8 03 00 00 00 ba da c9    B/..............
0030: ab c3 d7 cb f7 c0 f2 bc fd 20 28 31 30 30 30 29    ......... (1000)
0040: 00 00 cd 42 2f 13 00 00 6d 02 01 1e 00 00 00 00    ...B/...m.......
0050: c7 bf bb af d7 d4 ce d2 bc d3 cb d9 d2 a9 cb ae    ................
0060: 20 28 33 30 29 00 00 ce 42 2f 13 00 00 8b 04 01     (30)...B/......
0070: c8 00 00 00 00 b9 c5 b4 fa d6 d5 bc ab cc e5 c1    ................
0080: a6 bb d6 b8 b4 bc c1 20 28 32 30 30 29 00 00 d3    ....... (200)...
0090: 42 2f 13 10 00 d8 01 01 c8 00 00 00 00 b1 e4 d0    B/..............
00a0: ce be ed d6 e1 20 28 32 30 30 29 00 00 d4 42 2f    ..... (200)...B/
00b0: 13 00 00 e0 06 01 01 00 00 00 00 cb b5 bb b0 be    ................
00c0: ed d6 e1 00 00 d5 42 2f 13 06 00 d9 01 01 f4 01    ......B/........
00d0: 00 00 00 cb b2 bc e4 d2 c6 b6 af be ed d6 e1 20    ............... 
00e0: 28 35 30 30 29 00 00 d9 42 2f 13 00 00 2e 0a 01    (500)...B/......
00f0: c8 00 00 00 00 c4 a7 b7 a8 bd e1 be a7 cc e5 20    ............... 
0100: 28 32 30 30 29 00 00 dd 42 2f 13 00 00 46 06 01    (200)...B/...F..
0110: 01 00 00 00 00 bc c6 cb e3 bb fa 00 00 de 42 2f    ..............B/
0120: 13 17 00 72 02 01 01 00 00 00 00 c3 f0 c4 a7 bd    ...r............
0130: e4 d6 b8 00 00 df 42 2f 13 17 00 72 02 01 01 00    ......B/...r....
0140: 00 00 00 c3 f0 c4 a7 bd e4 d6 b8 00 00 e7 42 2f    ..............B/
0150: 13 01 00 17 01 01 01 00 00 00 00 c1 d4 c8 cb d6    ................
0160: ae b9 ad 00 00                                     .....

[Send C]:
0000: 66 c5 42 2f 13 00 00 00                            f.B/....            S_OPCODE_LIGHT

[Send C]:

[Send C]:
0000: 22 c5 42 2f 13 01 00 00 00 00 10 08 09 0c 12 0c    ".B/............    S_OPCODE_OWNCHARSTATUS
0010: 10 00 10 00 01 00 01 00 0a 44 f3 f5 96 28 00 00    .........D...(..
0020: 00 00 00 00 00                                     .....

[Send C]:
0000: 37 cb 7f 73 80 55 01 30 13 db 03 00 05 0e 00 00    7.s.U.0........    S_OPCODE_DROPITEM
0010: 00 00 00 00 00 cc e1 b0 c2 00 00 00 00 00 00 00    ................
0020: 00 00 00 ff 00 01 00 ff ff                         .........

[Send C]:
0000: 37 c2 7f 69 80 d7 44 2f 13 e6 03 00 05 00 00 05    7.i..D/........    S_OPCODE_DROPITEM
0010: 00 00 00 01 80 cd c3 d7 d3 00 00 00 00 00 00 00    ................
0020: 00 00 00 ff 00 02 00 ff ff                         .........

[Send C]:
0000: 37 cf 7f 69 80 d5 44 2f 13 e6 03 00 01 00 00 05    7.i..D/........    S_OPCODE_DROPITEM
0010: 00 00 00 01 80 cd c3 d7 d3 00 00 00 00 00 00 00    ................
0020: 00 00 00 ff 00 02 00 ff ff                         .........

[Send C]:
0000: 3e d7 44 2f 13 c2 7f 69 80 03 81 00 00 00 00 00    >.D/..i........    S_OPCODE_MOVEOBJECT

[Send C]:
0000: 37 c7 7f 73 80 d6 44 2f 13 e6 03 00 05 00 00 05    7.s..D/........    S_OPCODE_DROPITEM
0010: 00 00 00 01 80 cd c3 d7 d3 00 00 00 00 00 00 00    ................
0020: 00 00 00 ff 00 02 00 ff ff                         .........

[Send C]:
0000: 37 cc 7f 61 80 ac 01 30 13 ac 03 00 05 0e 00 00    7.a...0........    S_OPCODE_DROPITEM
0010: 00 00 00 00 00 c0 d7 bf cb c2 fc 00 00 00 00 00    ................
0020: 00 00 00 00 00 ff 00 00 00 ff ff                   ...........

[Send C]:
0000: 37 c2 7f 71 80 aa ff 2f 13 5d 08 00 06 0e 00 00    7.q.../.]......   S_OPCODE_DROPITEM
0010: 00 00 00 00 00 b3 f5 bc b6 b4 ab cb cd ca a6 00    ................
0020: 00 00 00 00 00 00 00 00 00 ff 00 00 00 ff ff       ...............

[Send C]:
0000: 3e d5 44 2f 13 cf 7f 69 80 04 81 00 00 00 00 00    >.D/..i........   S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d7 44 2f 13 c3 7f 6a 80 03 81 00 00 00 00 00    >.D/..j........   S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d5 44 2f 13 cf 7f 6a 80 04 81 00 00 00 00 00    >.D/..j........   S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d7 44 2f 13 c4 7f 6b 80 03 81 00 00 00 00 00    >.D/..k........   S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d5 44 2f 13 cf 7f 6b 80 04 81 00 00 00 00 00    >.D/..k........   S_OPCODE_MOVEOBJECT

INFO: [Recv C]
0000: 6a 00 00 00                                        j...              C_OPCODE_KEEPALIVE

INFO: [Recv C]
0000: 72 06 01 00                                        r...              C_OPCODE_LOGINTOSERVEROK

INFO: [Recv C]
0000: 72 09 00 d7                                        r...              C_OPCODE_LOGINTOSERVEROK

INFO: [Recv C]
0000: 72 0a 01 7a                                        r..z              C_OPCODE_LOGINTOSERVEROK

INFO: [Recv C]
0000: 23 0d 01 0b                                        #...              C_OPCODE_SENDLOCATION

[Send C]:
0000: 3e d6 44 2f 13 c7 7f 73 80 06 81 00 00 00 00 00    >.D/..s........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d7 44 2f 13 c5 7f 6c 80 03 81 00 00 00 00 00    >.D/..l........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d5 44 2f 13 cf 7f 6c 80 04 81 00 00 00 00 00    >.D/..l........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d6 44 2f 13 c6 7f 73 80 06 81 00 00 00 00 00    >.D/..s........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d7 44 2f 13 c6 7f 6d 80 03 81 00 00 00 00 00    >.D/..m........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d6 44 2f 13 c5 7f 73 80 06 81 00 00 00 00 00    >.D/..s........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d7 44 2f 13 c7 7f 6e 80 03 81 00 00 00 00 00    >.D/..n........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d6 44 2f 13 c4 7f 73 80 06 81 00 00 00 00 00    >.D/..s........  S_OPCODE_MOVEOBJECT

[Send C]:
0000: 3e d7 44 2f 13 c8 7f 6f 80 00 81 00 00 00 00 00    >.D/..o........  S_OPCODE_MOVEOBJECT

INFO: [Recv C]
0000: 2b 38 00 00                                        +8..             C_OPCODE_QUITGAME

经过测试其中角色进入游戏需要发送的最少数据包及顺序如下:

  • S_OPCODE_HOUSEMAP
  • S_OPCODE_LOGINTOGAME
  • 4个空字节
  • S_OPCODE_OWNCHARSTATUS
  • S_OPCODE_MAPID
  • S_OPCODE_CHARPACK
  • S_OPCODE_CHARTITLE
  • S_OPCODE_OWNCHARSTATUS

接下来分析对应处理代码,将可以延后实现的代码注释,列举核心功能点

C_OPCODE_LOGINTOSERVER

需要实现:

  • 世界系统(所有游戏对象的存储和删除):World.py
  • 复活点系统(重新登入或者使用回家卷轴返回的位置):GetBackRestartTable.py、GetBackRestart.py、GetBackTable.py
  • 村庄位置系统(返回每个村庄的回城点):TownLocation.py

S_OPCODE_HOUSEMAP

需要实现:S_InitialAbilityGrowth.py

S_OPCODE_LOGINTOGAME

需要实现:S_LoginToGame.py

S_OPCODE_OWNCHARSTATUS

需要实现:

  • 游戏时钟系统(游戏时间和现实时间的相互映射):GameTime.py、GameTimeClock.py
  • 玩家仓库系统(玩家仓库道具的添加、更新和删除,以及道具重量和数目的统计;初期可以跳过道具的相关操作的具体实现,只需返回空即可):Inventory.py、PcInventory.py

S_OPCODE_MAPID

需要实现:S_MapID.py

S_OPCODE_CHARPACK

需要实现:S_OwnCharPack.py

S_OPCODE_CHARTITLE

需要实现:S_CharTitle.py

延后实现:

  • 道具系统
  • 仓库系统
  • 战争管理
  • 视觉效果显示(中毒、水下)
  • 祝福经验
  • 血盟系统
  • 结婚系统
  • 地狱系统
  • 在线奖励系统
  • GM监视系统
  • 角色封号系统
  • 记忆坐标系统
  • 服务器时间系统
  • 灯光系统
  • 技能系统
  • 宠物系统
  • 聊天系统
  • 税收系统
  • 装备道具系统

世界系统

World

实现游戏世界对象的存储,
获取游戏范围的可见对象

  • 直线上的可见游戏对象:两个游戏对象间的可见对象(游戏地图可以看做一个大的二维数组矩阵,二维数组中任意两个元素相连,计算连线经过的所有二维元素,源码的createLineMap函数使用的是Bresenham画线算法)
  • 矩形内的可见游戏对象:游戏玩家面向的前方矩形范围内的可见对象(源码的getVisibleBoxObjects主要用到了二维坐标系转换算法,以当前玩家位置为原点,朝向为X轴正方向建立坐标系,并将其他游戏对象的坐标都转换到此坐标系中)
  • 圆内的可见游戏对象:游戏玩家周围范围内的可见对象(源码的getVisiblePlayer函数用的是近似算法,算的其实是圆的外切正方形内所有可见对象)

时钟系统

GameTime

实现现实世界时间到游戏时间的相互映射

角色仓库使用

前面角色登入后背包内是没有道具的,现在我们要实现仓库系统,角色登入后可打开背包查看道具,借用下角色登入时候的仓库封包

[Send C]:
0000: 45 0c c6 42 2f 13 ff 00 05 00 01 20 a1 07 00 00    E..B/...... ....      S_OPCODE_INVLIST
0010: bd f0 b1 d2 20 28 35 30 30 30 30 30 29 00 00 c7    .... (500000)...
0020: 42 2f 13 00 00 1a 07 01 e8 03 00 00 00 ba da c9    B/..............
0030: ab c3 d7 cb f7 c0 f2 bc fd 20 28 31 30 30 30 29    ......... (1000)
0040: 00 00 cd 42 2f 13 00 00 6d 02 01 1e 00 00 00 00    ...B/...m.......
0050: c7 bf bb af d7 d4 ce d2 bc d3 cb d9 d2 a9 cb ae    ................
0060: 20 28 33 30 29 00 00 ce 42 2f 13 00 00 8b 04 01     (30)...B/......
0070: c8 00 00 00 00 b9 c5 b4 fa d6 d5 bc ab cc e5 c1    ................
0080: a6 bb d6 b8 b4 bc c1 20 28 32 30 30 29 00 00 d3    ....... (200)...
0090: 42 2f 13 10 00 d8 01 01 c8 00 00 00 00 b1 e4 d0    B/..............
00a0: ce be ed d6 e1 20 28 32 30 30 29 00 00 d4 42 2f    ..... (200)...B/
00b0: 13 00 00 e0 06 01 01 00 00 00 00 cb b5 bb b0 be    ................
00c0: ed d6 e1 00 00 d5 42 2f 13 06 00 d9 01 01 f4 01    ......B/........
00d0: 00 00 00 cb b2 bc e4 d2 c6 b6 af be ed d6 e1 20    ............... 
00e0: 28 35 30 30 29 00 00 d9 42 2f 13 00 00 2e 0a 01    (500)...B/......
00f0: c8 00 00 00 00 c4 a7 b7 a8 bd e1 be a7 cc e5 20    ............... 
0100: 28 32 30 30 29 00 00 dd 42 2f 13 00 00 46 06 01    (200)...B/...F..
0110: 01 00 00 00 00 bc c6 cb e3 bb fa 00 00 de 42 2f    ..............B/
0120: 13 17 00 72 02 01 01 00 00 00 00 c3 f0 c4 a7 bd    ...r............
0130: e4 d6 b8 00 00 df 42 2f 13 17 00 72 02 01 01 00    ......B/...r....
0140: 00 00 00 c3 f0 c4 a7 bd e4 d6 b8 00 00 e7 42 2f    ..............B/
0150: 13 01 00 17 01 01 01 00 00 00 00 c1 d4 c8 cb d6    ................
0160: ae b9 ad 00 00                                     .....

道具系统

仓库系统存储的是道具,所以在实现仓库系统前必须先实现道具系统

Item

道具模板对象抽象:

属性:

  • 描述属性(材质、种类、强化等级、使用职业、道具本身的属性加层)

方法:

  • 获取对应描述属性

Item.py、Weapon.py、EtcItem.py、Armor.py

ItemInstance

道具实例对象抽象:

属性:

  • 个数
  • 道具模板
  • 重量
  • 使用状态
  • 强化状态(武卷强化、防卷强化、饰品强化)
  • 道具强化后的属性加成(人物属性加成、人物抗性加成)

方法:

  • 道具名称显示 => 火灵 +10 匕首(挥舞)
  • 道具魔法加持效果(延后实现)

ItemInstance.py

ItemTable

道具系统管理对象抽象:

属性:

  • 道具模板集合

方法:

  • 从数据库加载道具模板到内存(材料道具、武器道具、防具道具)
  • 使用道具模板创建道具实例

ItemTable.py

仓库系统

Inventory

仓库对象抽象:

属性:

  • 仓库物品集合

方法:

  • 计算仓库内物品的总数、重量
  • 添加道具
  • 删除道具
  • 更新道具数目
  • 消耗道具(武卷防卷强化、黑魔石提炼、魔法宝石)
  • 交易道具(延后实现)

Inventory.py、DwarfInventory.py、DwarfForElfInventory.py

PcInventory

玩家背包对象抽象:

属性:

  • 背包所属游戏对象
  • 优先使用的箭矢

方法:

  • 道具耐久和损坏度计算
  • 道具耐久和损坏修复

PcInventory.py

以上完成后可补充前面的角色创建的初始赠送道具的流程

原文地址:https://www.cnblogs.com/silvermagic/p/7666359.html