找到了,就是下面的内容。
声明:纯搬家!
经典帖子 只发一次 !!
今天有人找我帮他修补卡分制符咒的bug, 半天了 ,我没有搞懂到底是怎么卡的,
感谢 LV夏天 [url]http://@LV夏天[/url] , 我知道怎么操作了!
卡符咒操作: 买3张同样的符咒 ,分制符咒, 然后分开 成 2个和1个 !
此时 ,你把2个的其中一个使用掉,然后把2个的另外一个丢弃,然后在使用之前
分出来的那一个, 你会惊奇的发现, 居然成功使用了。按游戏规则,相同符咒不能同时
使用2张的,可这明显是使用了2张, 然后重新登陆或者过地图后失效 !!
于是我想了一下, 这个发生在删除那张符咒之后,那么,出现这个bug,肯定是删除这
张符咒的过程中发生的!!于是我调试了下MapServer
结果让我瞠目结舌 !
// 下面这句代码是丢弃物品过程使用到的函数
int CItemManager::DiscardItem(CPlayer* pPlayer, POSTYPE whatPos, WORD whatItemIdx, DURTYPE whatItemNum)
//它里面有个 if else 分支 !
if(IsDupItem(pItemBase->wIconIdx) && (pItemBase->Durability > whatItemNum))
{
//如果删除的物品是叠加的 ,况且被分开的两部分的叠加数目有大小之分执行这里
//todo ....
}
else
{
//如果删除的物品是单个一张,而被分开的另一部分也是一张执行这里
//todo 然后致命的bug就出现在下面
//pPlayer->GetShopItemManager()->DeleteUsingShopItem( whatItemIdx );
//liuwei 2014-06-27 卡符咒解决!
//DeleteUsingShopItem( whatItemIdx ); 这里是从正在使用的符咒内存表中删除该物
//此时他已经从正在使用的内存表中把该符咒删除了,然后,当第二次使用这个物品的 时候, 此时已经检测不到该物品已经被使用了,自然就被第二次使用了!如下
//SHOPITEMWITHTIME* pShopItem = m_UsingItemTable.GetData( ItemIdx );
//这也就解释了为何重新登陆或者过地图回恢复,因为重新获取CPlayer 对象了!
//从数据库表中重新填充了该符咒使用列表,自然在无法重复吃了!!
}
这就是卡符咒造成的根本原因, 这是一个很隐蔽,也难发现的bug,
毕竟在老墨, 新墨, 谁会傻到把符咒删除了在吃!!
我想这个函数当时eya的技术写的时候,应该为了方便,把丢弃物品统统一个函数处理
了! 这个函数用来处理已经穿在身上的百宝,到期后自动删除是必要的,但是用它来
处理删除符咒, 这个就画蛇添足了!! 当时估计没有想到这一点!!
解决方法:
此处公布解决方法:同时鄙视下这个2B -> jottxi , Jaeng 这两个人
这2人的水平不知道杂样,但是一点职业道德都没有!!
解决代码:
if(pItemInfo->ItemType==10)
{
//若是符咒类物品,删除后清理释放站用的POS就可以了!
//初步估计,卡兔子也是在这里,加上物品类型判断就好了!我没测试!
pPlayer->GetShopItemManager()->DeleteDupParam(pItemInfo);
}
else
{
//其他时效类物品,删除执行原来的方法!
pPlayer->GetShopItemManager()->DeleteUsingShopItem( whatItemIdx ); //liuwei 2014-06-27 卡符咒解决!
}
然后 符咒就无法重复使用了,(之前看到有人用的是禁止删除和重叠解决的)
现在不用那么复杂,几句代码搞定!
上张图 :
声明:纯搬家!
经典帖子 只发一次 !!
今天有人找我帮他修补卡分制符咒的bug, 半天了 ,我没有搞懂到底是怎么卡的,
感谢 LV夏天 [url]http://@LV夏天[/url] , 我知道怎么操作了!
卡符咒操作: 买3张同样的符咒 ,分制符咒, 然后分开 成 2个和1个 !
此时 ,你把2个的其中一个使用掉,然后把2个的另外一个丢弃,然后在使用之前
分出来的那一个, 你会惊奇的发现, 居然成功使用了。按游戏规则,相同符咒不能同时
使用2张的,可这明显是使用了2张, 然后重新登陆或者过地图后失效 !!
于是我想了一下, 这个发生在删除那张符咒之后,那么,出现这个bug,肯定是删除这
张符咒的过程中发生的!!于是我调试了下MapServer
结果让我瞠目结舌 !
// 下面这句代码是丢弃物品过程使用到的函数
int CItemManager::DiscardItem(CPlayer* pPlayer, POSTYPE whatPos, WORD whatItemIdx, DURTYPE whatItemNum)
//它里面有个 if else 分支 !
if(IsDupItem(pItemBase->wIconIdx) && (pItemBase->Durability > whatItemNum))
{
//如果删除的物品是叠加的 ,况且被分开的两部分的叠加数目有大小之分执行这里
//todo ....
}
else
{
//如果删除的物品是单个一张,而被分开的另一部分也是一张执行这里
//todo 然后致命的bug就出现在下面
//pPlayer->GetShopItemManager()->DeleteUsingShopItem( whatItemIdx );
//liuwei 2014-06-27 卡符咒解决!
//DeleteUsingShopItem( whatItemIdx ); 这里是从正在使用的符咒内存表中删除该物
//此时他已经从正在使用的内存表中把该符咒删除了,然后,当第二次使用这个物品的 时候, 此时已经检测不到该物品已经被使用了,自然就被第二次使用了!如下
//SHOPITEMWITHTIME* pShopItem = m_UsingItemTable.GetData( ItemIdx );
//这也就解释了为何重新登陆或者过地图回恢复,因为重新获取CPlayer 对象了!
//从数据库表中重新填充了该符咒使用列表,自然在无法重复吃了!!
}
这就是卡符咒造成的根本原因, 这是一个很隐蔽,也难发现的bug,
毕竟在老墨, 新墨, 谁会傻到把符咒删除了在吃!!
我想这个函数当时eya的技术写的时候,应该为了方便,把丢弃物品统统一个函数处理
了! 这个函数用来处理已经穿在身上的百宝,到期后自动删除是必要的,但是用它来
处理删除符咒, 这个就画蛇添足了!! 当时估计没有想到这一点!!
解决方法:
此处公布解决方法:同时鄙视下这个2B -> jottxi , Jaeng 这两个人
这2人的水平不知道杂样,但是一点职业道德都没有!!
解决代码:
if(pItemInfo->ItemType==10)
{
//若是符咒类物品,删除后清理释放站用的POS就可以了!
//初步估计,卡兔子也是在这里,加上物品类型判断就好了!我没测试!
pPlayer->GetShopItemManager()->DeleteDupParam(pItemInfo);
}
else
{
//其他时效类物品,删除执行原来的方法!
pPlayer->GetShopItemManager()->DeleteUsingShopItem( whatItemIdx ); //liuwei 2014-06-27 卡符咒解决!
}
然后 符咒就无法重复使用了,(之前看到有人用的是禁止删除和重叠解决的)
现在不用那么复杂,几句代码搞定!
上张图 :