Скакун: без крови не заводится, звук велосипеда, без дыма
- Мотор не заводится без сфер и глохнет, когда кровь кончилась (ваниль заводила его и с пустым баком - ехал на полной тяге); вставили сферу в седле - заводится. - Звуки мотора у скакуна молчат; на ходу - стук педалей bicycle_pedal, гудок и колёса - велосипедные. - Частицы дыма/огня убраны (розовые кубы - ванильные частицы без материалов). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
7b315cda6b
commit
f1c1e61e8d
+8
-5
@@ -2,7 +2,8 @@
|
|||||||
<!-- Костяной скакун (1.7.0, 01.10.2026). vehicles.xml наследования не знает - это копия
|
<!-- Костяной скакун (1.7.0, 01.10.2026). vehicles.xml наследования не знает - это копия
|
||||||
ванильного vehicleMotorcycle (игра 3.3) под именем сущности necroBoneSteed. Отличия:
|
ванильного vehicleMotorcycle (игра 3.3) под именем сущности necroBoneSteed. Отличия:
|
||||||
recipeName -> предмет necroBoneSteedPlaceable (его и возвращает подбор скакуна), без
|
recipeName -> предмет necroBoneSteedPlaceable (его и возвращает подбор скакуна), без
|
||||||
honkEvent (гудок открывает двери торговца - скакуну незачем). Топливо - кровавые сферы
|
honkEvent (гудок открывает двери торговца - скакуну незачем). Звуки велосипеда:
|
||||||
|
мотор молчит, педали и гудок - BoneSteedEnginePatch и hornSound. Топливо - кровавые сферы
|
||||||
в ячейках модификаций (BoneSteedFuelPatch), канистрой не заправить. -->
|
в ячейках модификаций (BoneSteedFuelPatch), канистрой не заправить. -->
|
||||||
<append xpath="/vehicles">
|
<append xpath="/vehicles">
|
||||||
<vehicle name="necroBoneSteed">
|
<vehicle name="necroBoneSteed">
|
||||||
@@ -24,7 +25,7 @@
|
|||||||
<property name="unstickForce" value="1"/>
|
<property name="unstickForce" value="1"/>
|
||||||
<property name="waterDrag_y_velScale_velMaxScale" value="1.7, .9, .1"/>
|
<property name="waterDrag_y_velScale_velMaxScale" value="1.7, .9, .1"/>
|
||||||
<property name="wheelPtlScale" value="1"/>
|
<property name="wheelPtlScale" value="1"/>
|
||||||
<property name="hornSound" value="motorbike_horn"/>
|
<property name="hornSound" value="bicycle_horn"/>
|
||||||
<property name="recipeName" value="necroBoneSteedPlaceable" />
|
<property name="recipeName" value="necroBoneSteedPlaceable" />
|
||||||
|
|
||||||
<property class="chassis">
|
<property class="chassis">
|
||||||
@@ -34,9 +35,7 @@
|
|||||||
|
|
||||||
<property class="engine">
|
<property class="engine">
|
||||||
<property name="class" value="Engine"/>
|
<property name="class" value="Engine"/>
|
||||||
<property name="particleOn" value="Particles/p_on"/>
|
<!-- Частиц нет: ванильные дым/огонь в нашем бандле без материалов - розовые кубы (01.10). -->
|
||||||
<property name="particleDamaged" value="Particles/p_damaged"/>
|
|
||||||
<property name="particleBroken" value="Particles/p_broken"/>
|
|
||||||
<property name="fuelKmPerL" value=".2"/>
|
<property name="fuelKmPerL" value=".2"/>
|
||||||
<property name="foodDrain" value=".002,.0101"/><!-- driving/turbo, motorcycle -->
|
<property name="foodDrain" value=".002,.0101"/><!-- driving/turbo, motorcycle -->
|
||||||
|
|
||||||
@@ -109,11 +108,15 @@
|
|||||||
<property class="wheel0">
|
<property class="wheel0">
|
||||||
<property name="tireTransform" value="M/Forks/Wheel0"/>
|
<property name="tireTransform" value="M/Forks/Wheel0"/>
|
||||||
<property name="torqueScale_motor_brake" value=".15, .5"/>
|
<property name="torqueScale_motor_brake" value=".15, .5"/>
|
||||||
|
<property name="bounceSound" value="bicycle_suspension"/>
|
||||||
|
<property name="slideSound" value="bicycle_brake"/>
|
||||||
</property>
|
</property>
|
||||||
|
|
||||||
<property class="wheel1">
|
<property class="wheel1">
|
||||||
<property name="tireTransform" value="Wheel1"/>
|
<property name="tireTransform" value="Wheel1"/>
|
||||||
<property name="torqueScale_motor_brake" value="1, 1"/>
|
<property name="torqueScale_motor_brake" value="1, 1"/>
|
||||||
|
<property name="bounceSound" value="bicycle_suspension"/>
|
||||||
|
<property name="slideSound" value="bicycle_brake"/>
|
||||||
</property>
|
</property>
|
||||||
|
|
||||||
<property class="headlight">
|
<property class="headlight">
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using HarmonyLib;
|
||||||
|
|
||||||
|
namespace NecromancerTome
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Двигатель костяного скакуна (тест 01.10.2026):
|
||||||
|
///
|
||||||
|
/// - «ДАЖЕ БЕЗ СФЕР ЕДЕТ БЫСТРО». Ванильный VPEngine.startEngine ставит isRunning без
|
||||||
|
/// проверки топлива, а глохнет только по событию FuelEmpty - то есть когда бак пустеет на
|
||||||
|
/// ходу. Заведённый с пустым баком мотор так и работал на полной тяге. Здесь: без крови мотор
|
||||||
|
/// не заводится, кончилась на ходу - глохнет; вставили сферу, сидя в седле, - заводится сам.
|
||||||
|
/// Без мотора у ванили остаётся тяга x50 - еле ползёт, как пустой мотоцикл.
|
||||||
|
/// - «ЗВУК МОТОЦИКЛА УБРАТЬ, ПУСТЬ БУДЕТ ВЕЛОСИПЕД». Все звуки мотора (заводка, глушение,
|
||||||
|
/// обороты) у скакуна молчат; вместо них на ходу под тягой - стук педалей bicycle_pedal с
|
||||||
|
/// ритмом ванильного велосипеда (VPPedals: 0.75 с, на турбо 0.55 с). Деталь Pedals ванили
|
||||||
|
/// не годится - ей нужны шатун и педали в модели.
|
||||||
|
/// Дым и огонь (розовые кубы - частицы без материалов) убраны в vehicles.xml и префабе.
|
||||||
|
/// </summary>
|
||||||
|
public static class BoneSteedEngine
|
||||||
|
{
|
||||||
|
public const string PedalSound = "bicycle_pedal";
|
||||||
|
static readonly Dictionary<int, float> pedalTimers = new Dictionary<int, float>();
|
||||||
|
|
||||||
|
public static bool Is(VehiclePart part) => part?.vehicle != null && BoneSteed.Is(part.vehicle.entity);
|
||||||
|
|
||||||
|
public static bool HasBlood(Vehicle v) => BoneSteedFuel.FuelOf(v) > 0f;
|
||||||
|
|
||||||
|
public static void Pedal(VPEngine engine, float dt)
|
||||||
|
{
|
||||||
|
Vehicle v = engine.vehicle;
|
||||||
|
EntityVehicle e = v.entity;
|
||||||
|
if (e == null || e.isEntityRemote || !e.HasDriver || !engine.isRunning ||
|
||||||
|
v.CurrentMotorTorquePercent <= 0f || v.CurrentForwardVelocity <= 0.3f)
|
||||||
|
{
|
||||||
|
pedalTimers.Remove(e != null ? e.entityId : 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pedalTimers.TryGetValue(e.entityId, out float t);
|
||||||
|
t += dt;
|
||||||
|
if (t > (v.IsTurbo ? 0.55f : 0.75f))
|
||||||
|
{
|
||||||
|
e.PlayOneShot(PedalSound);
|
||||||
|
t = 0f;
|
||||||
|
}
|
||||||
|
pedalTimers[e.entityId] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(VPEngine), nameof(VPEngine.startEngine))]
|
||||||
|
public static class Patch_VPEngine_startEngine_BoneSteed
|
||||||
|
{
|
||||||
|
public static bool Prefix(VPEngine __instance) =>
|
||||||
|
!BoneSteedEngine.Is(__instance) || BoneSteedEngine.HasBlood(__instance.vehicle);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(VPEngine), nameof(VPEngine.Update))]
|
||||||
|
public static class Patch_VPEngine_Update_BoneSteed
|
||||||
|
{
|
||||||
|
public static void Postfix(VPEngine __instance, float _dt)
|
||||||
|
{
|
||||||
|
if (!BoneSteedEngine.Is(__instance))
|
||||||
|
return;
|
||||||
|
Vehicle v = __instance.vehicle;
|
||||||
|
bool blood = BoneSteedEngine.HasBlood(v);
|
||||||
|
if (__instance.isRunning && !blood)
|
||||||
|
__instance.stopEngine(true);
|
||||||
|
else if (!__instance.isRunning && blood && v.entity.HasDriver && !__instance.IsBroken())
|
||||||
|
__instance.startEngine();
|
||||||
|
BoneSteedEngine.Pedal(__instance, _dt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(VPEngine), nameof(VPEngine.playSound))]
|
||||||
|
public static class Patch_VPEngine_playSound_BoneSteed
|
||||||
|
{
|
||||||
|
public static bool Prefix(VPEngine __instance) => !BoneSteedEngine.Is(__instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(VPEngine), nameof(VPEngine.updateEngineSounds))]
|
||||||
|
public static class Patch_VPEngine_updateEngineSounds_BoneSteed
|
||||||
|
{
|
||||||
|
public static bool Prefix(VPEngine __instance) => !BoneSteedEngine.Is(__instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user