设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2720|回复: 6
打印 上一主题 下一主题

[RMXP发布] 自制脚本 - 防止变数及金钱被修改_v2

[复制链接]

Lv1.梦旅人

梦石
0
星屑
95
在线时间
18 小时
注册时间
2008-1-22
帖子
46
跳转到指定楼层
1
发表于 2012-1-7 16:45:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 土撥撥 于 2012-1-7 16:54 编辑

大约一年半以前吧,我和我所属团队的朋友合力制作出了一个能够防止数值遭到修改器修改的脚本,

后来犹豫了很久之后,才决定要发出来给大家研究:lol
  1. #===================================================================
  2. # 变数及金钱内部数值保护脚本_v2 by 金也安里 & 解冻猪脚(土拨拨)
  3. #-------------------------------------------------------------------
  4. # $vg_Start : 设定欲保护之变量范围(起点)
  5. # $vg_End : 设定欲保护之变量范围(结束)
  6. # $vg_warning : 所弹出之中文讯息
  7. # $vg_pop : 所弹出讯息之样式--
  8. # 0 : 不弹出通知窗口而直接关闭游戏
  9. # 1 : 弹出警告窗口($vg_warning的内容)
  10. # 2 : 弹出较完整的警告窗口($vg_warning的内容加上被修改前及被修改后的数值)
  11. # $vg_except : 不列入保护范围的变量代号。
  12. # 假设7号与10号变量不需被保护则将$vg_except设为[7,10]
  13. # $vg_nguard : 是否关闭此功能(true为是,false为否)
  14. #-------------------------------------------------------------------
  15. # 使用方法:
  16. # 将此脚本直接取代Main脚本即可,
  17. #  之后若需更改Main设定请至此脚本尾调整。
  18. #
  19. # 注意事项:
  20. # 勿使用 $game_party.gold += x 语法,
  21. # 请将其改为 $game_party.gain_gold(x) 。
  22. #===================================================================


  23. #==================================
  24. # 脚本设定
  25. #==================================
  26. $vg_Start = 1
  27. $vg_End = 100
  28. $vg_warning = "系统数值发生异常"
  29. $vg_pop = 1
  30. $vg_except = []
  31. $vg_nguard = false
  32. #==================================


  33. #脚本初始化。此处资料不需更动
  34. $vplus = []
  35. $gplus = (rand(20000) + 1) * 1001
  36. $gplus += rand(1001)
  37. for i in $vg_Start..$vg_End
  38. $vplus.push(rand(9999))
  39. end
  40. $old_V = []

  41. #主要核心
  42. module Var_Guard
  43. def self.all_1
  44. self::Game_Party_Gold.Game_Party_Gold_1
  45. self::V_C.check_1
  46. end
  47. def self.all_2
  48. self::Game_Party_Gold.Game_Party_Gold_2
  49. for i in $vg_Start..$vg_End
  50. self::V_C.check_2(i)
  51. end
  52. end
  53. module Game_Party_Gold
  54. def self.Game_Party_Gold_1
  55. @old_gold = $game_party.gold * $gplus
  56. end
  57. def self.Game_Party_Gold_2
  58. unless $vg_nguard
  59. if @old_gold != $game_party.gold * $gplus and @old_gold != nil
  60. @a = $game_party.gold - (@old_gold / $gplus)
  61. @c = 0
  62. @b = $game_temp.gold_check
  63. @b.each{|i| @c += i}
  64. if @a == @c
  65. @old_gold = $game_party.gold * $gplus
  66. @b.clear
  67. else
  68. print $vg_warning if $vg_pop == 1
  69. print "#{$vg_warning}\n:::Error10000-#{@old_gold/($gplus)}-#{$game_party.gold}" if $vg_pop == 2
  70. exit
  71. end
  72. end
  73. end
  74. end
  75. end
  76. module V_C
  77. def self.check_1
  78. for i in $vg_Start..$vg_End
  79. if $gplus != nil and $vplus[i] !=nil
  80. $old_V[i] = $game_variables[i] * ($gplus + $vplus[i])
  81. end
  82. end
  83. end
  84. def self.check_2(v)
  85. unless $vg_nguard
  86. if $gplus != nil and $vplus[v] !=nil
  87. if $old_V[v] != $game_variables[v] * ($gplus + $vplus[v]) and $old_V[v] != nil
  88. @a = $game_variables[v] - ($old_V[v] / ($gplus+$vplus[v]))
  89. @c = 0
  90. @b = $game_temp.V_check[v]
  91. @b.each{|i| @c += i}
  92. if @a == @c
  93. $old_V[v] = $game_variables[v] * ($gplus + $vplus[v])
  94. @b.clear
  95. elsif (@a != @c) and (not $vg_except.include?(v))
  96. tmp = sprintf("1%04d",v)
  97. print $vg_warning if $vg_pop == 1
  98. print "#{$vg_warning}\n:::Error#{tmp}-#{$old_V[v]/($gplus+$vplus[v])}-#{$game_variables[v]}" if $vg_pop == 2
  99. exit
  100. end
  101. end
  102. end
  103. end
  104. end
  105. end
  106. end

  107. #新增此系统需要的变量
  108. class Game_Temp
  109. attr_accessor :gold_check
  110. attr_accessor :V_check
  111. alias tubobo_initialize initialize
  112. def initialize
  113. tubobo_initialize
  114. @gold_check = []
  115. @V_check = []
  116. $old_V = []
  117. for i in $vg_Start..$vg_End
  118. @V_check[i] = []
  119. end
  120. end
  121. end

  122. #重新定义变量被更改时触发的脚本
  123. class Game_Variables
  124. def []=(variable_id, value)
  125. @a = $game_variables[variable_id]
  126. if variable_id <= 5000
  127. @data[variable_id] = value
  128. end
  129. @a_1 = ($game_variables[variable_id]-@a)
  130. $game_temp.V_check[variable_id].push(@a_1)
  131. end
  132. end

  133. #重新定义取得金钱的方式
  134. class Game_Party
  135. def gain_gold(n)
  136. @og = @gold
  137. @gold = [[@gold + n, 0].max, 9999999].min
  138. $game_temp.gold_check.push(@gold-@og)
  139. end
  140. end
  141. class Scene_Map
  142. alias tubobo_mupd update
  143. def update
  144. tubobo_mupd
  145. begin;Var_Guard.all_2;rescue;end
  146. end
  147. end

  148. #此处可设定Main之内容
  149. begin
  150. Graphics.freeze
  151. Font.default_name = (["宋体"])
  152. $scene = Scene_Title.new
  153. while $scene != nil
  154. begin;Var_Guard.all_2;rescue;end
  155. begin;Var_Guard.all_1;rescue;end
  156. $scene.main
  157. end
  158. Graphics.transition(20)
  159. rescue Errno::ENOENT
  160. filename = $!.message.sub("No such file or directory - ", "")
  161. print("找不到文件 #{filename}。 ")
  162. end
复制代码
缩排被去掉了...那我贴脚本连结

大概说明一下原理好了。想说太多变量名字都乱取,怕大家会看得吃力。

脚本大致定义的内容:

先随机产生一个数值,用以当作类似「浮动数值」的效果(这里暂称为浮动数值)。

另外再产生一个Array用来放置经过系统所变动的内容。

一个Scene的main过程开始的时候先让系统读取一次「目前的变量及金钱」(这里暂称为旧值),

并将旧值和浮动数值相乘,这时候再修改Scene_Map的内容:

系统刷新(update)的时候检查一次,

若存放变动量的Array有新的东西就加进旧值并重新读取一次,

「旧值÷浮动数值」 ≠ Scene刚开始时的金钱或变量加上值的变动量

就弹出警告窗口并退出游戏。

(切换Scene的时候也会再检查一次)

这时候这个脚本所呈现出来的效果就是:

在地图上的时候只要遭到修改,就会立刻弹出通知;

若是在其它画面遭到修改则切换Scene的时候弹出通知。

(如果每个Scene的update过程都要检查一次,会很容易与其它脚本造成冲突)

若要保护HP、MaxHP、MP、MaxMP、STR、DEX、AGI、INT……也可以如法炮制。
 
RGSS研究專員

Lv1.梦旅人

梦石
0
星屑
52
在线时间
704 小时
注册时间
2011-12-27
帖子
941
2
发表于 2012-1-7 16:57:41 手机端发表。 | 只看该作者
本帖最后由 zeldafd 于 2012-1-7 16:59 编辑

讚耶,防止作弊軟件的腳本^_^
先收起了,謝謝^_^
(也可以解除某遊戲修改金錢不能的問题^口^)<=邪恶人士【人生第一張沙發】
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39860
在线时间
7493 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

3
发表于 2012-1-7 16:59:10 | 只看该作者
兼容性都快没了,你不能直接捕捉游戏焦点状态,然后转存所有全局变量么
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
发表于 2012-1-7 17:03:32 | 只看该作者
本帖最后由 yangff 于 2012-1-7 17:03 编辑

秒破完毕= =这种脚本放出来就没有意义了
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
95
在线时间
18 小时
注册时间
2008-1-22
帖子
46
5
 楼主| 发表于 2012-1-7 17:12:00 | 只看该作者
本帖最后由 土撥撥 于 2012-1-7 17:13 编辑
fux2 发表于 2012-1-7 16:59
兼容性都快没了,你不能直接捕捉游戏焦点状态,然后转存所有全局变量么


這腳本的確是兼容性不大......轉成插件式腳本也只好這樣子了=_=|||

秒破完毕= =这种脚本放出来就没有意义了

??
 
RGSS研究專員
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

6
发表于 2012-1-7 17:19:27 | 只看该作者
土撥撥 发表于 2012-1-7 17:12
這腳本的確是兼容性不大......轉成插件式腳本也只好這樣子了=_=|||

你代码都放出来了我就可以直接通过原始值得到@old_gold的地址然后算出$gplus。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
95
在线时间
18 小时
注册时间
2008-1-22
帖子
46
7
 楼主| 发表于 2012-1-7 17:32:34 | 只看该作者
yangff 发表于 2012-1-7 17:19
你代码都放出来了我就可以直接通过原始值得到@old_gold的地址然后算出$gplus。 ...

倒是還好,如果是有心人士去把它加工一下什麼的就會更安全了
RGSS研究專員
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-12 10:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表