脚本模块.bas
上传用户:pcw2004
上传日期:2022-02-02
资源大小:743k
文件大小:12k
源码类别:

DirextX编程

开发平台:

Visual Basic

  1. Attribute VB_Name = "脚本模块"
  2. Option Explicit
  3. Public Type ScriptType  '脚本属性
  4.     ScriptName As String
  5.     ScriptStr As String
  6. End Type
  7. Public Type NpcType 'NPC属性
  8.     X As Integer
  9.     Y As Integer
  10.     Name_名称 As String
  11.     Image As Integer
  12.     Pic As Integer
  13.     PicSpeed As Integer
  14.     PTime As Long
  15.     ScriptCount As Integer
  16.     Script() As ScriptType
  17.     ScriptFileName As String
  18. End Type
  19. Public SelNpcNum As Integer
  20. Public NpcCount As Integer
  21. Public NPCInfo() As NpcType
  22. Public mScript As String
  23. '#####################################################  此函数作者:junny ################################################################################################
  24. Public Function ActScript(ByVal mPlayer As Integer, ByVal mNpc As Integer, ByVal mScript As String, Optional ByVal inValue As String) As String
  25.     Dim IFstr, ACTstr, ELSEstr, ELSESAYstr As String
  26.     Dim IFvalue As Boolean
  27.     Dim mWord, mData, mVal As Variant
  28.     Dim i, j, k As Long
  29.     Dim tmpStr, mStr As String
  30.     Dim tmpNum, MonID As Long
  31.     Dim N1 As Integer, N2 As Integer
  32.     Dim S1 As String, S2 As String
  33.     Dim mSay As String
  34.     '系统变量
  35.     mScript = SysVariable(mPlayer, mNpc, mScript, inValue)
  36.     IFvalue = True
  37.     
  38.     '去掉TAB字符
  39.     mScript = Replace(mScript, vbTab & vbTab, " ")
  40.     mScript = Replace(mScript, vbTab, " ")
  41.     '去掉多余的空格
  42.     For i = 9 To 2 Step -1
  43.         mScript = Replace(mScript, String(i, " "), " ")
  44.     Next i
  45.     mScript = Replace(mScript, " " & vbCrLf, vbCrLf)
  46.     IFstr = TakeStr(mScript, "#IF" & vbCrLf, vbCrLf & "#ACT")
  47.     If IFstr = "" Then IFstr = TakeStr(mScript, "#if" & vbCrLf, vbCrLf & "#act")
  48.     If IFstr = "" Then IFstr = TakeStr(mScript, "#IF" & vbCrLf, vbCrLf & "#SAY")
  49.     If IFstr = "" Then IFstr = TakeStr(mScript, "#if" & vbCrLf, vbCrLf & "#say")
  50.     '#ACT后面可能是#ELSE也可能是#ELSESAY
  51.     ACTstr = TakeStr(mScript, "#ACT" & vbCrLf, vbCrLf & "#ELSE")
  52.     If ACTstr = "" Then ACTstr = TakeStr(mScript, "#act" & vbCrLf, vbCrLf & "#else")
  53.     If ACTstr = "" Then ACTstr = TakeStr(mScript, "#ACT" & vbCrLf, vbCrLf & "")
  54.     If ACTstr = "" Then ACTstr = TakeStr(mScript, "#act" & vbCrLf, vbCrLf & "")
  55.     
  56.     '如果没有ELSE语句
  57.     If ACTstr = "" Then ACTstr = TakeStr(mScript, "#ACT" & vbCrLf, "")
  58.     ELSEstr = TakeStr(mScript, "#ELSE" & vbCrLf, "")
  59.     If ELSEstr = "" Then ELSEstr = TakeStr(mScript, "#else" & vbCrLf, "")
  60.     ELSESAYstr = TakeStr(mScript, "#ELSESAY" & vbCrLf, "")
  61.     If ELSESAYstr = "" Then ELSESAYstr = TakeStr(mScript, "#elsesay" & vbCrLf, "")
  62.     If ELSESAYstr = "" Then ELSESAYstr = TakeStr(mScript, "#SAY" & vbCrLf, "")
  63.     
  64.     '如果脚本中不含有IF ACT成分,那么呈现整个脚本给客户端
  65.     If (IFstr = "") And (ACTstr = "") And (ELSESAYstr = "") Then IFvalue = False: ELSESAYstr = mScript
  66.     
  67.     '如果只包含ACT语句,则执行
  68.     If (IFstr = "") And (ACTstr <> "") Then IFvalue = True
  69.     '执行判断语句
  70.     mWord = Split(IFstr, vbCrLf)
  71.     For i = 0 To UBound(mWord)
  72.         mData = Split(mWord(i), " ")
  73.         If UBound(mData) >= 0 Then
  74.             Select Case UCase(mData(0))
  75.                 Case "CHECKLEVEL"
  76.                     IFvalue = IFvalue And Player(mPlayer).Level >= mData(1)
  77.                 Case "CHECKPK"
  78.                     IFvalue = IFvalue And Player(mPlayer).PK值 >= mData(1)
  79.                 Case "CHECKJOB"
  80.                     IFvalue = IFvalue And (Player(mPlayer).Job_职业 = mData(1))
  81.                 Case "CHECKSEX"
  82.                     IFvalue = IFvalue And (Player(mPlayer).Sex_性别 = mData(1))
  83.                 Case "CHECKGOLD"
  84.                     IFvalue = IFvalue And (Player(mPlayer).Gold_金币 >= mData(1))
  85. '                Case "CHECKITEM"
  86. '                    Dim AA As String
  87. '                    AA = mData(1)
  88. ''                    tmpNum = GetItemCount(AA)
  89. '                    If UBound(mData) >= 2 Then
  90. '                        N1 = mData(2)
  91. '                        IFvalue = IFvalue And (tmpNum) >= N1
  92. '                    Else
  93. '                        IFvalue = IFvalue And 1
  94. '                    End If
  95.                 
  96.             End Select
  97.         End If
  98.     Next i
  99.     '根据上面的判断,生成相应的字符串
  100.     If Not IFvalue Then ACTstr = ELSEstr
  101.     If ACTstr <> "" Then
  102.         mWord = Split(Replace(ACTstr, vbCrLf & vbCrLf, vbCrLf), vbCrLf)
  103.         For i = 0 To UBound(mWord)
  104.             If mWord(i) <> "" Then
  105.                 tmpStr = ""
  106.                 mData = Split(mWord(i), " ")
  107.                 Select Case UCase(mData(0))
  108.                     Case "MSG"
  109. '                        MsgBox Player(mPlayer).PK值, , "PK"
  110.                     Case "SAY"
  111.                         mSay = TakeStr(mWord(i), "say ", "")
  112.                         If mSay = "" Then mSay = TakeStr(mWord(i), "Say ", "")
  113.                         If mSay = "" Then mSay = TakeStr(mWord(i), "SAY ", "")
  114.                         tmpStr = NPCInfo(mNpc).Name_名称 & "/" & mSay
  115.                     Case "ADDFAME" '声望
  116.                         Player(mPlayer).Fame_声望值 = Player(mPlayer).Fame_声望值 + mData(1)
  117.                     Case "TAKE" '拿走包裹装备
  118.                         S1 = mData(1)
  119.                         
  120.                         If mData(1) = "金币" Then
  121.                             If UBound(mData) >= 2 Then
  122.                                 N1 = mData(2)
  123.                                 Player(mPlayer).Gold_金币 = Player(mPlayer).Gold_金币 - N1
  124.                             End If
  125.                         Else
  126.                             If UBound(mData) >= 2 Then
  127.                                 N1 = mData(2)
  128.                             Else
  129.                                 N1 = 1
  130.                             End If
  131. '                            ShouItemCount S1, N1
  132.                             
  133.                         End If
  134.                     Case "FAMEUP"
  135.                         Player(mPlayer).Fame_声望值 = Player(mPlayer).Fame_声望值 + mData(1)
  136.                     Case "MAPMOVE"
  137.                         Player(mPlayer).Map_地图 = mData(1)
  138.                     Case "GIVE" '给物品
  139.                         If mData(1) = "金币" Then
  140.                             Player(mPlayer).Gold_金币 = Player(mPlayer).Gold_金币 + mData(2)
  141.                             FrmMain.Server(mPlayer).SendData PLAYERGOLD & KONGDATA & mPlayer & KONGDATA & Player(mPlayer).Name_名字 & KONGDATA & Player(mPlayer).Gold_金币 & NETKONGDATA
  142.                             
  143.                         Else
  144.                             S1 = mData(1)
  145.                             If UBound(mData) >= 2 Then
  146.                                 N1 = mData(2)
  147.                             Else
  148.                                 N1 = 1
  149.                             End If
  150.                             tmpNum = GetItemNum(S1)
  151.                             If tmpNum > 0 Then
  152. '                                GiveItem Items(tmpNum), N1
  153.                                 FrmMain.Server(mPlayer).SendData GIVEITEMDATA & KONGDATA & mPlayer & KONGDATA & Player(mPlayer).Name_名字 & KONGDATA & ItemStr(ItemDB(tmpNum)) & KONGDATA & N1 & NETKONGDATA
  154.                             End If
  155.                         End If
  156.                     Case "SEX"
  157.                         Player(mPlayer).Sex_性别 = mData(1)
  158.                         For j = 1 To playercount
  159.                             If Player(j).Connected = True Then
  160.                                 If FrmMain.Server(j).State = sckConnected Then
  161.                                     FrmMain.Server(j).SendData PLAYERSEX & KONGDATA & mPlayer & KONGDATA & Player(mPlayer).Name_名字 & KONGDATA & Player(mPlayer).Sex_性别 & NETKONGDATA
  162.                                 End If
  163.                             End If
  164.                         Next
  165.                         
  166.                     Case "LEVELUP"  '升级
  167.                         Player(mPlayer).Level = Player(mPlayer).Level + mData(1)
  168.                         If Player(mPlayer).Level > 255 Then Player(mPlayer).Level = 1
  169.                         FrmMain.Server(mPlayer).SendData PLAYERLEVEL & KONGDATA & mPlayer & KONGDATA & Player(mPlayer).Name_名字 & KONGDATA & Player(mPlayer).Level & NETKONGDATA
  170.                         
  171.                     Case "LEVELDOWN"  '降级
  172.                         Player(mPlayer).Level = Player(mPlayer).Level - mData(1)
  173.                         If Player(mPlayer).Level < 1 Then Player(mPlayer).Level = 1
  174.                         FrmMain.Server(mPlayer).SendData PLAYERLEVEL & KONGDATA & mPlayer & KONGDATA & Player(mPlayer).Name_名字 & KONGDATA & Player(mPlayer).Level & NETKONGDATA
  175.                         
  176.                 End Select
  177.             End If
  178.         Next i
  179.     Else
  180.         tmpStr = ELSESAYstr
  181.         
  182.     End If
  183.     
  184.     '字符串变量
  185.     tmpStr = SysVariable(mPlayer, mNpc, tmpStr, inValue)
  186. '    tmpStr = JiaMiC(tmpStr)
  187.     
  188.     '要向客户端发送的字符串
  189.     ActScript = tmpStr '执行结果已加密
  190. End Function
  191. Public Function SysVariable(ByVal mPlayer As Integer, ByVal mNpc As Integer, ByVal mScript As String, Optional ByVal inValue As String) As String
  192.     Dim mStr As String
  193.     Dim i As Long
  194.     '系统变量
  195.     mScript = Replace(mScript, "<$NPCNAME>", NPCInfo(mNpc).Name_名称)
  196.     mScript = Replace(mScript, "<$USERNAME>", Player(mPlayer).Name_名字)
  197.     mScript = Replace(mScript, "<$USERLEVEL>", Player(mPlayer).Level)
  198. '    mScript = Replace(mScript, "<$USERLUCKY>", player(mplayer).Lucky)
  199.     mScript = Replace(mScript, "<$USERPK>", Player(mPlayer).PK值)
  200. '    mScript = Replace(mScript, "<$USERIP>", P7200.sckPost(player(mplayer).SocksID).RemoteHostIP)
  201.     mScript = Replace(mScript, "<$USERFAME>", Player(mPlayer).Fame_声望值)
  202. '    mScript = Replace(mScript, "<$USEGUILD>", player(mplayer).Guild)
  203. '    mScript = Replace(mScript, "<$USERSUBHUMAN>", player(mplayer).SubHuman)
  204.     mScript = Replace(mScript, "<$USERMAP>", Player(mPlayer).Map_地图)
  205.     mScript = Replace(mScript, "<$USERX>", Player(mPlayer).X)
  206.     mScript = Replace(mScript, "<$USERY>", Player(mPlayer).Y)
  207.     mScript = Replace(mScript, "<$USERHOMEMAP>", Player(mPlayer).HomeMap)
  208.     mScript = Replace(mScript, "<$USERHOMEX>", Player(mPlayer).HomeX)
  209.     mScript = Replace(mScript, "<$USERHOMEY>", Player(mPlayer).HomeY)
  210.     mScript = Replace(mScript, "<$YEAR>", Year(Now))
  211.     mScript = Replace(mScript, "<$DATE>", Date)
  212.     mScript = Replace(mScript, "<$TIME>", Time)
  213.     mScript = Replace(mScript, "<$LOGINLONG>", Player(mPlayer).LoginTime)
  214. '    mScript = Replace(mScript, "<$RUNTIME>", Sec2Min(timeGetTime  1000))
  215. '    mScript = Replace(mScript, "<$SABUKGUILD>", SABUK.OwnerGuild)
  216. '    mScript = Replace(mScript, "<$SABUKGUILDBOSS>", SABUK.OwnerBoss)
  217. '    mScript = Replace(mScript, "<$SABUKGOLD>", SABUK.Gold)
  218.     mScript = Replace(mScript, "<$INPUTVAL>", inValue)
  219.     SysVariable = mScript
  220. End Function
  221. '############################################################################################################################
  222. Function TakeStr(Str As Variant, StartStr As String, EndStr As String) As String
  223.     Dim Len1 As Integer
  224.     Dim Len2 As Integer
  225.     Dim SS As String
  226.     Len1 = InStr(Str, StartStr)
  227.     If Len1 = 0 Then Exit Function
  228.     Len2 = InStr(Len1, Str, EndStr)
  229.     If Len2 > Len1 + Len(StartStr) Then
  230.         SS = Mid(Str, Len1 + Len(StartStr), Len2 - Len1 - Len(StartStr))
  231.     Else
  232.         SS = Mid(Str, Len1 + Len(StartStr), Len(Str) - Len1 - Len(StartStr))
  233.     End If
  234.     TakeStr = SS
  235.     
  236. End Function
  237. Public Function GetFunNum(mNpc As Integer, FunName As String) As Integer
  238.     Dim i As Integer
  239.     For i = 1 To NPCInfo(mNpc).ScriptCount
  240.         If UCase(NPCInfo(mNpc).Script(i).ScriptName) = UCase(FunName) Then
  241.             GetFunNum = i
  242.             Exit For
  243.             Exit Function
  244.         End If
  245.     Next
  246. End Function
  247. Public Sub LoadScriptFile(mNpc As Integer, FileName As String)
  248.     Dim i As Integer
  249.     Dim Str As String
  250.     Dim Work1 As Boolean
  251.     Open FileName For Input As #1
  252.         Do While Not EOF(1)
  253.             Line Input #1, Str
  254.             If Left(Str, 1) = "[" Then
  255.                 NPCInfo(mNpc).ScriptCount = NPCInfo(mNpc).ScriptCount + 1
  256.                 ReDim Preserve NPCInfo(mNpc).Script(NPCInfo(mNpc).ScriptCount)
  257.                 NPCInfo(mNpc).Script(NPCInfo(mNpc).ScriptCount).ScriptName = Mid(Str, 2, Len(Str) - 2)
  258.             Else
  259.                 NPCInfo(mNpc).Script(NPCInfo(mNpc).ScriptCount).ScriptStr = NPCInfo(mNpc).Script(NPCInfo(mNpc).ScriptCount).ScriptStr & Str & vbCrLf
  260.             End If
  261.             DoEvents
  262.         Loop
  263.     Close #1
  264. End Sub