: 36)

游戏中充值平台是一个很重要的环节,基于77访问文件及数据库的功能,通过变通处理能支持任何的充值平台,对于充值平台本身就是写文件或数据库的模式则更是易如反掌。

在示范版本中我们只做了基于写文件的充值模式,下面则是玩家充值后领取元宝的核心代码:

unit Q4;

{

    充值模块说明:

  本模块适用于在”Mir200\Envir\QuestDiary\充值积分”文件夹里对应的文本中写入充值账号信息的充值方式

}

inte**ce

  uses Classes, SysUtils, DefiniensConst, ExtendFuns;

procedure DoObtainGold(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); //领取元宝入口函数

implementation

//检查账号在指定充值文件中存在的行数,并删除,返回行数*比例

function CheckAccount(const TxtFile, Account: String; Rate: Double): Double;

var

  LS: TStrings;

  Idx: Integer;   

  ASum: Integer;

begin

  Result    :=    0;              

  //检查是否存在文件

  if FileExists(TxtFile) then

  begin

    LS    :=    TStringList.Create;     

    ASum:=    0; //初始取到的行数为0

    try            

      //将文件加载到TStrings对象

      LS.LoadFromFile(TxtFile);

      while true do

      begin

        Idx    :=    LS.IndexOf(Account);

        //取出一条账号记录

       if Idx <> -1 then

        begin            

          //如果取到了记录,则删除这条记录,并增加取到的行数

          LS.Delete(Idx);

          Inc(ASum);         

        end

        else   

          //没取到则直接跳出循环

          Break;

      end;      

      if ASum > 0 then

        //如果取到的行数大于0,则说明对列表有做过更新,需要保存

        LS.SaveToFile(TxtFile);

      //返回元宝数量(取到的行数x比例)   

      Result:= ASum    * Rate;

    finally

      LS.Free;

    end;   

  end;

end;

//领取充值元宝

procedure DoObtainGold(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);

var

  AGoldSum: Double;

begin

if G_GoldLocked then

  begin

    //如果G_GoldLocked为True,则表示正在为其他玩家发放元宝,为了不引起并发读写问题,当前此次请求无效

    //此类处理方法可有效避免并发文本读写造成的数据错乱

    Player.SendCenterMessage(‘我正在为其他玩家发放元宝,请稍后!!!’, 0);

    Exit;

  end;   

  //将G_GoldLocked置为True

  G_GoldLocked    :=    True;

  try      

    //初始化当前领取到的元宝总数为0,然后从每个文件中去读取元宝数量

    //示范版本中以常见的充值方式处理元宝处理,如果是读取数据库充值记录,则可以采用Gamelib.DBEngine对象来处理   

    AGoldSum    :=    0;

    AGoldSum    :=    AGoldSum + CheckAccount(‘Envir\QuestDiary\充值积分\yb01.txt’, Player.Account, 0.1);

    AGoldSum    :=    AGoldSum + CheckAccount(‘Envir\QuestDiary\充值积分\yb02.txt’, Player.Account, 0.2);

    AGoldSum    :=    AGoldSum + CheckAccount(‘Envir\QuestDiary\充值积分\yb1.txt’, Player.Account, 1);

    AGoldSum    :=    AGoldSum + CheckAccount(‘Envir\QuestDiary\充值积分\yb2.txt’, Player.Account, 2);

    AGoldSum    :=    AGoldSum + CheckAccount(‘Envir\QuestDiary\充值积分\yb6.txt’, Player.Account, 6);

    //作为演示,这里省略更多的元宝比例文件

    if AGoldSum > 0 then

    begin

      //如果玩家领取到的元宝数量大于0   

      AGoldSum    :=    AGoldSum * 100;                          

      Player.GameGold    :=    Player.GameGold + Round(AGoldSum);

      Player.GoldChanged;

      Player.SendCenterMessage(‘元宝领取成功,一共领取元宝’+IntToStr(Round(AGoldSum))+’个!!!’, 0);

    end

    else

      Player.SendCenterMessage(‘元宝领取失败,暂时没有你的充值信息!!!’, 0);

  finally                  

    //领取结束,将G_GoldLocked置为False,此时其他玩家可执行元宝领取了

    G_GoldLocked    :=    False;

  end;

end;

end.

上面代码中,CheckAccount函数就是检查文本文件中是否存在某账号记录,如果存在则全部取出来,算出对应的元宝数量并返回。

DoObtainGold函数则是一个普通的入口函数,即玩家点击客户端界面可触发的函数,这个函数先是提取出玩家有多少元宝,然后将元宝发放给玩家

声明:本站所有文章,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们(hljlife@vip.qq.com)进行处理。

本站所有资源来源于网络,本站未参与任何dump或hack活动。若有侵犯您的权益请提供相关证明致邮hljlife@vip.qq.com,我将及时撤下该资源。

All resources come from the network, this site does not participate in any dump or hack activities, if there is any violation of your rights, please provide relevant proof and email hljlife@vip.qq.com, I will promptly delete it.

如果下载资源文件后缀为.PDF,请删除后缀.PDF之后运行。

部分失效链接可通过文末填写有效邮箱到Email输入框留言索取。

免责声明:游戏资源均来自网络收集购买,不保证BUG,不保证病毒,不解答游戏问题(传奇服务端提供付费架设服务),为了安全,请尽量选择虚拟机运行服务端。