红月私服地图增加公告栏和邮箱

我们已经在红月私服地图增加了物体,但没有点击事件,你能在客户端增加物体的点击事件,教程中的坐标存储地址是在未增加点击事件前的地址,增加点击事件后,坐标存储地址的开始位置将向后移动36字节
我们现在以79号地图的客户文件来讲解增加点击事件,我们用16进制打开这个文件
00000000  13 52 65 64 4D 6F 6F 6E  20 4D 61 70 44 61 74 61
00000010  20 31 2E 30 C8 00 00 00  C8 00 00 00 08 C8 F7 B8
00000020  BB B6 F3 BE DF 4F 00 00  00 02 00 00 00 02 00 4F
00000030  18 00 00 5F 09 00 00 6F  18 00 00 8F 09 00 00 01
00000040  00 9F 17 00 00 B7 08 00  00 FF 17 00 00 17 09 00
00000050  00 B0 0B 00 23 00 00 00  00 00 20 09 23 00 00 00
颜色--地图的最大X坐标C8=200
颜色--地图的最大Y坐标C8=200
颜色--地图的编号4F=79
颜色--地图上有2个点击事件
颜色--0200就是邮箱
4F 18 00 00 点击事件的X1坐标
5F 09 00 00 点击事件的Y1坐标
6F 18 00 00 点击事件的X2坐标
8F 09 00 00 点击事件的Y2坐标
颜色--0100就是公告板
9F 17 00 00 点击事件的X1坐标
B7 08 00 00 点击事件的Y1坐标
FF 17 00 00 点击事件的X2坐标
17 09 00 00 点击事件的Y2坐标
颜色--地图坐标数据的开始位置,从这里开始将存储地图每一坐标点的数据,如地面,地面物体等

点击事件的的坐标地址我们也有计算公式
先进行转换,将你的计算器调整为科学型,所有数据使用16进制计算
4F180000=>0000184F
5F090000=>0000095F
6F180000=>0000186F
8F090000=>0000098F
我们依据下面的公式进行计算
184F*2AAAAAAB/800000000=81 => 129(十进制) X1坐标
95F*2AAAAAAB/400000000=63 => 99(十进制) Y1坐标
186F*2AAAAAAB/800000000=82 => 130(十进制) X2坐标
98F*2AAAAAAB/400000000=65 => 101(十进制) Y1坐标

新的坐标点你是能依据公式很容易的进行反向计算

{:3_41:}哦。为什么我的地图邮箱点击后不工作?
{:3_52:}这是需要修改程序svMapServer.exe来支持它
支持邮箱工作的地图如下
map 0--38
map 47--67
map 109-129
map 131
由于版本情况比较复杂,我们先rm3.944 1.1b的修改
我有反汇编svMapServer.exe程序,先看2小段代码

.text:004460CC                 lea     ecx, [eax-1] //ecx=eax-1
.text:004460CF                 cmp     ecx, 25h        ; switch 38 cases

.text:0044618F ; ---------------------------------------------------------------------------
.text:0044618F
.text:0044618F loc_44618F:                             ; CODE XREF: CMapServerServer::LoadMap(void)+C2j
.text:0044618F                                         ; CMapServerServer::LoadMap(void)+D0j
.text:0044618F                                         ; DATA XREF: ...
.text:0044618F                 cmp     eax, 2Fh        ; default
.text:0044618F                                         ; jumptable 004460E0 cases 1,3-19,21-27,29-35
.text:00446192                 jl      short loc_446199
.text:00446194                 cmp     eax, 43h
.text:00446197                 jle     short loc_4461AC
.text:00446199
.text:00446199 loc_446199:                             ; CODE XREF: CMapServerServer::LoadMap(void)+182j
.text:00446199                 cmp     eax, 6Dh
.text:0044619C                 jl      short loc_4461A5
.text:0044619E                 cmp     eax, 81h
.text:004461A3                 jle     short loc_4461AC
.text:004461A5
.text:004461A5 loc_4461A5:                             ; CODE XREF: CMapServerServer::LoadMap(void)+18Cj
.text:004461A5                 cmp     eax, 83h
.text:004461AA                 jnz     short loc_4461BC
.text:004461AC
.text:004461AC loc_4461AC:                             ; CODE XREF: CMapServerServer::LoadMap(void)+187j
.text:004461AC                                         ; CMapServerServer::LoadMap(void)+193j
.text:004461AC                 lea     eax, [esi+3300h]
.text:004461B2                 mov     ecx, edi
.text:004461B4                 push    eax
.text:004461B5                 push    4
.text:004461B7                 call    ?GetMapEventFirstPIS@CrsMap@@QAEHGPAUPIS@@@Z ; CrsMap::GetMapEventFirstPIS(ushort,PIS *)
---------------------------3944_1.1b修改地址------------------------------------------
从上面我们可以清楚的看到那些地图可以开启邮箱,我们现在有2种修改方案
1.注意在定义完地图后,有一个跳转  jnz     short loc_4461BC
作用是当地图不在我们定义的范围内的时候就会跳转到地址4461BC
,此地址告诉客户端不开启邮件
这样我们可以NOP掉这个跳转,修改地址
0x461aa    75 10 --> 90 90
90 90就是NOP掉了这条指令

2.就是修改上面的定义地图范围,我们可以扩大这个范围,修改地址
0x460d1    25 = 37
0x46191    2F = 47
0X46196    43 = 79
0X4619b    6D = 109
0x4619f    81 = 129
0x461a6    83 = 131
你可以把它修改到你喜欢的值
-----------------------------------------------------------------------------
---------------------------3.8原版修改地址------------------------------------------
0x461aa    75 10 --> 90 90
0x460d1    25 = 37
0x46191    2F = 47
0X46196    43 = 79
0X4619b    6D = 109
0x4619f    81 = 129
0x461a6    83 = 131
  
---------------------------------------------------------------------------------
------------------------3944_2.5修改地址-----------------------------------
由于2.5的程序加密过,无法反编译,如果你能完整脱壳,我将整理如何修改

-------------------------------------------------------------------------------

有人就会问了,你不少说0-38号地图吗?,25的十进制不是37吗?
lea     ecx, [eax-1] //ecx=eax-1
cmp     ecx, 25h        ; switch 38 cases
请看这里,所有地图定义的值都存储在eax,这里给的值是ecx
看上面一句ecx,[eax-1],那么
ecx=eax-1 ===> eax=ecx+1
那么ecx值应该比我们定义的地图最大编号小1

今天先到这里,我会在后面继续为大家讲解更多客户端服务端的修改