Skip to content

Commit ba4f810

Browse files
committed
feat: QuickMoveとAntiCheatのロジックを改善
QuickMoveとAntiCheat機能の内部ロジックを改善し、より堅牢で自然な挙動を実現しました。 - QuickMove: - Y軸の速度成分が保持されるよう修正し、不自然な速度リセットを防止。 - AntiCheatとの連携設定を`isFeatureEnabled`から`isSettingEnabled`へ変更。 - `MoveMode.None`時の早期リターンを追加。 - AntiCheat: - レイテンシに基づいて動的に許容値を調整するロジックを導入。 - 不正な速度をより適切に制限するため、`vecMin`関数を用いた速度クランプ処理を追加。 - `QuickMoveTolerance`と`QuickMoveLatencyMultiplier`設定を公開。 - InfiniteCommand: - `reset`コマンドのエラーハンドリングとフィードバックメッセージを改善。 - 言語ファイル: - `ja_jp.json`の末尾の余分なカンマを修正。
1 parent 0702769 commit ba4f810

File tree

5 files changed

+56
-41
lines changed

5 files changed

+56
-41
lines changed

src/client/kotlin/org/infinite/features/movement/move/QuickMove.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class QuickMove : ConfigurableFeature() {
235235
val player = player ?: return Vec3d.ZERO
236236
val options = options
237237
val velocity = velocity ?: return Vec3d.ZERO // 現在のベロシティ
238-
238+
if (currentMode == MoveMode.None) return velocity
239239
var forwardInput = 0.0
240240
var strafeInput = 0.0
241241

@@ -368,24 +368,17 @@ class QuickMove : ConfigurableFeature() {
368368
val newVelZ = cosYaw * localVelForward + sinYaw * localVelStrafe
369369

370370
// X, Z成分のみを更新して返す
371-
return Vec3d(newVelX, 0.0, newVelZ)
371+
return Vec3d(newVelX, this.velocity?.y ?: player.velocity.y, newVelZ)
372372
}
373373

374374
override fun onTick() {
375375
// 加速度更新をTickの最初に行う
376-
if (InfiniteClient.isFeatureEnabled(AntiCheat::class.java)) return
377376
updatePlayerAccelerationSpeed()
378-
if (currentMode == MoveMode.None) return
379377
val player = player ?: return
380378
val vehicle = player.vehicle
381-
382-
// 車両が有効な場合は、プレイヤーのYawを車両に適用
383379
vehicle?.yaw = player.yaw
384-
385-
// calculateVelocityを呼び出し、新しい水平ベロシティを取得
386-
val newVelocityXZ = calculateVelocity()
387-
388-
// 既存のY成分を保持し、XとZ成分を更新
389-
this.velocity = Vec3d(newVelocityXZ.x, this.velocity?.y ?: player.velocity.y, newVelocityXZ.z)
380+
if (InfiniteClient.isSettingEnabled(AntiCheat::class.java, "EnableForQuickMove")) return
381+
val newVelocity = calculateVelocity()
382+
this.velocity = Vec3d(newVelocity.x, newVelocity.y, newVelocity.z)
390383
}
391384
}
Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.infinite.features.server.anti
22

3+
import net.minecraft.util.math.Vec3d
34
import org.infinite.InfiniteClient
45
import org.infinite.feature.ConfigurableFeature
56
import org.infinite.features.movement.move.QuickMove
@@ -10,7 +11,8 @@ class AntiCheat : ConfigurableFeature(initialEnabled = true) {
1011
private val enableForQuickMove = FeatureSetting.BooleanSetting("EnableForQuickMove", false)
1112
private val quickMoveTolerance = FeatureSetting.DoubleSetting("QuickMoveTolerance", 0.05, 0.0, 0.3)
1213
private val quickMoveLatencyMultiplier = FeatureSetting.DoubleSetting("QuickMoveLatencyMultiplier", 0.5, 0.0, 1.0)
13-
override val settings: List<FeatureSetting<*>> = listOf(enableForQuickMove)
14+
override val settings: List<FeatureSetting<*>> =
15+
listOf(enableForQuickMove, quickMoveTolerance, quickMoveLatencyMultiplier)
1416

1517
override fun onTick() {
1618
if (enableForQuickMove.value) {
@@ -21,37 +23,41 @@ class AntiCheat : ConfigurableFeature(initialEnabled = true) {
2123
private fun handleQuickMove() {
2224
val quickMove = InfiniteClient.getFeature(QuickMove::class.java) ?: return
2325
val player = player ?: return
24-
// スプリント中は判定を無効化するべき
2526
if (player.isSprinting && player.isOnGround) return
2627
val networkHandler = player.networkHandler ?: return
2728
val netWorkPlayer = networkHandler.getPlayerListEntry(player.uuid) ?: return
28-
// 1. レイテンシ(Ping)を取得 (単位: ミリ秒)
2929
val latencyMS = netWorkPlayer.latency
30-
// 2. 許容倍率の計算に必要なパラメータを取得
3130
val baseTolerance = quickMoveTolerance.value // 基本的な許容値 (例: 0.05)
3231
val latencyMultiplier = quickMoveLatencyMultiplier.value // レイテンシに適用する倍率 (例: 0.5)
33-
// 3. 許容倍率 (Tolerance Multiplier) の計算
34-
// レイテンシを加味した動的な許容量を算出します。
35-
// レイテンシが大きいほど許容量も大きくなります。
36-
// Pingが0msの場合、許容量はbaseToleranceのみ。
37-
// Pingが200msの場合、baseTolerance + (200 * 0.001 * 0.5) となる。
3832
val dynamicToleranceMultiplier: Double =
3933
baseTolerance + (latencyMS.toDouble() * 0.001 * latencyMultiplier)
40-
// ここから既存のロジック
41-
quickMove.updatePlayerAccelerationSpeed()
4234
val modifiedVelocity = quickMove.calculateVelocity()
4335
val originalVelocity = player.velocity
4436
val diffVelocity = modifiedVelocity.subtract(originalVelocity) // チートによる理想値との差
4537
val originalSpeed = originalVelocity.horizontalLength()
4638
val diffSpeed = diffVelocity.horizontalLength()
47-
val diffMultiplier = diffSpeed / originalSpeed
39+
val diffProgress = diffSpeed / originalSpeed
4840
player.velocity =
49-
if (diffMultiplier > dynamicToleranceMultiplier) {
41+
if (diffProgress > dynamicToleranceMultiplier) {
42+
val m = (diffProgress / dynamicToleranceMultiplier).coerceIn(0.0, 1.0)
5043
val modifiedVelocity =
51-
originalVelocity.add(diffVelocity.multiply(diffMultiplier / dynamicToleranceMultiplier))
44+
vecMin(
45+
modifiedVelocity,
46+
originalVelocity.add(diffVelocity.multiply(m)),
47+
)
5248
modifiedVelocity
5349
} else {
5450
modifiedVelocity
5551
}
5652
}
53+
54+
private fun vecMin(
55+
a: Vec3d,
56+
b: Vec3d,
57+
): Vec3d =
58+
if (a.lengthSquared() > b.lengthSquared()) {
59+
b
60+
} else {
61+
a
62+
}
5763
}

src/client/kotlin/org/infinite/libs/infinite/InfiniteCommand.kt

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -410,40 +410,57 @@ object InfiniteCommand {
410410
null
411411
}
412412

413-
when {
413+
return when {
414414
cat == null -> {
415415
InfiniteClient.featureCategories.forEach { c ->
416416
c.features.forEach { f ->
417417
f.instance.reset()
418418
f.instance.settings.forEach { it.reset() }
419419
}
420420
}
421+
InfiniteClient.info(Text.translatable("command.infinite.config.reset.all").string)
422+
1
421423
}
422424

423425
feat == null -> {
424-
InfiniteClient.featureCategories.find { it.name == cat }?.features?.forEach { f ->
426+
val category =
427+
InfiniteClient.featureCategories.find { it.name == cat }
428+
?: return sendError("command.infinite.category.notfound", cat)
429+
430+
category.features.forEach { f ->
425431
f.instance.reset()
426432
f.instance.settings.forEach { it.reset() }
427433
}
428-
?: return 0
434+
InfiniteClient.info(Text.translatable("command.infinite.config.reset.category", cat).string)
435+
1
429436
}
430437

431438
key == null -> {
432-
InfiniteClient.searchFeature(cat, feat)?.let {
433-
it.reset()
434-
it.settings.forEach { setting ->
439+
val feature =
440+
InfiniteClient.searchFeature(cat, feat)
441+
?: return sendError("command.infinite.feature.notfound", cat, feat)
435442

436-
setting.reset()
437-
}
438-
} ?: return 0
443+
feature.reset()
444+
feature.settings.forEach { setting ->
445+
setting.reset()
446+
}
447+
InfiniteClient.info(Text.translatable("command.infinite.config.reset.feature", feat).string)
448+
1
439449
}
440450

441451
else -> {
442-
InfiniteClient.searchFeature(cat, feat)?.getSetting(key)?.reset() ?: return 0
452+
val feature =
453+
InfiniteClient.searchFeature(cat, feat)
454+
?: return sendError("command.infinite.feature.notfound", cat, feat)
455+
val setting =
456+
feature.getSetting(key)
457+
?: return sendError("command.infinite.setting.notfound", key, feat)
458+
459+
setting.reset()
460+
InfiniteClient.info(Text.translatable("command.infinite.config.reset.setting", key, feat).string)
461+
1
443462
}
444463
}
445-
InfiniteClient.info(Text.translatable("command.infinite.config.reset.all").string)
446-
return 1
447464
}
448465

449466
private fun getVersion(): Int =

src/main/resources/assets/infinite/lang/en_us.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,7 @@
363363
"infinite.feature.server.anti_cheat.debug_hud.description": "Displays debug information for Anti-cheat.",
364364
"infinite.feature.server.anti_cheat.enable_for_quick_move.description": "Enables anti-cheat for quick movement.",
365365
"infinite.feature.server.anti_cheat.quick_move_tolerance.description": "Sets the tolerance for quick movement anti-cheat.",
366-
"infinite.feature.server.anti_cheat.quick_move_latency_multiplier.description": "Sets the latency multiplier for quick movement anti-cheat."
367-
},
366+
"infinite.feature.server.anti_cheat.quick_move_latency_multiplier.description": "Sets the latency multiplier for quick movement anti-cheat.",
368367
"key.infinite-client.toggle.server.anti_cheat": "Toggle Anti cheat",
369368
"infinite.feature.utils.hyper_map.description": "Displays a mini-map on the screen.",
370369
"infinite.feature.utils.hyper_map.radius.description": "Sets the radius of the mini-map display.",

src/main/resources/assets/infinite/lang/ja_jp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@
364364
"infinite.feature.server.anti_cheat.enable_for_quick_move.description": "クイックムーブメントのアンチチートを有効にします。",
365365
"infinite.feature.server.anti_cheat.quick_move_tolerance.description": "クイックムーブメントのアンチチートの許容範囲を設定します。",
366366
"infinite.feature.server.anti_cheat.quick_move_latency_multiplier.description": "クイックムーブメントのアンチチートの遅延乗数を設定します。",
367-
"key.infinite-client.toggle.server.anti_cheat": "Anti cheatを切り替える",,
367+
"key.infinite-client.toggle.server.anti_cheat": "Anti cheatを切り替える",
368368
"infinite.feature.utils.hyper_map.description": "画面にミニマップを表示します。",
369369
"infinite.feature.utils.hyper_map.radius.description": "ミニマップ表示の半径を設定します。",
370370
"infinite.feature.utils.hyper_map.height.description": "ミニマップに表示する垂直高さ範囲を設定します。",

0 commit comments

Comments
 (0)