序
此方法适用于1299,1310等版本,2.0的我没有见过,如果2.0中没有封ip的功能,那么此方法应该也适用于2.0的数据库。
正文
1299和1310版本的库中存在一个存储过程:PROC_INSERT_CURRENTUSER,作用是用户登陆后,将人物写入在线表CURRENTUSER,客户端传给这个存储的参数中有一个就是登陆者的IP,因此要封用户的IP,就要从这里入手。而其它存储如account_login,account_logout等没有发现有传入IP的地方,所以也只有挑这个了。
- CREATE PROCEDURE PROC_INSERT_CURRENTUSER
- @AccountID varchar(50),
- @CharID varchar(50),
- @ServerNo int,
- @ServerIP varchar(50),
- @ClientIP varchar(50),
- @nret smallint output
- AS
- INSERT INTO CURRENTUSER ( nServerNo, strServerIP, strAccountID, strCharID, strClientIP ) Values (@ServerNo, @ServerIP, @AccountID, @CharID, @ClientIP )
- set @nret=1
- GO
复制代码 这就是这个存储最原始的情况,如果我们将这个nret=0,那么用户就无法登陆了,因此方法很简单!我们接着看。
建立一个表,用于存我们封过的ip,比如叫S_IpBan,结构很简单,ip varchar(15)基本就可以以了,但是我们可以记录一下其它信息,比如封的原因,时间等,因此建表如下:
- CREATE TABLE [dbo].[S_IpBan] (
- [id] [int] IDENTITY (1, 1) NOT NULL ,
- [ip] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL ,
- [strReason] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
- [addTime] [smalldatetime] NULL
- ) ON [PRIMARY]
- GO
复制代码 接下来我们改存储PROC_INSERT_CURRENTUSER,如下:
- CREATE PROCEDURE PROC_INSERT_CURRENTUSER
- @AccountID varchar(50),
- @CharID varchar(50),
- @ServerNo int,
- @ServerIP varchar(50),
- @ClientIP varchar(50),
- @nret smallint output
- AS
- Declare @iban int,@ip varchar(21)
- select @ip=ip from S_IpBan where ip=ltrim(rtrim(@ClientIP))
- if @@ROWCOUNT = 0
- begin
- INSERT INTO CURRENTUSER ( nServerNo, strServerIP, strAccountID, strCharID, strClientIP ) Values (@ServerNo, @ServerIP, @AccountID, @CharID, @ClientIP )
- set @nret=1
- return
- end
- else
- begin
- set @nret=0
- return
- end
- GO
复制代码 保存后,即生效,至此基本完成。
操作方法
要封一个ip,即先将该ip记入S_IpBan表,比如123.123.123.132,即可,然后该ip上的用户到了选择人物处就中断,从而达到封ip的办法。
扩展功能
有些时间,我们为了调试方便,不想让玩家登陆,但只想让自己进入,这个即把上面的原理倒过来就可以了。我们来看操作:
把自己的ip写入s_ipban表,然后把 PROC_INSERT_CURRENTUSER中的if @@ROWCOUNT = 0改成if @@ROWCOUNT>0即可。
尾声
其实,封ip的方法很多牛人都能研究出来,也不是什么高深的东西,只要找到入口,自然会有办法。大家热爱骑士的,可是有很多人不愿意分享自己研究出来的东西,没办法。我记得有一句话怎么说来的?中国人喜欢单干,而西方人讲究团队,所以西方的事物发展比中国快。
有愿意讨论的,可以发邮件至[email protected]。 |