This commit is contained in:
Atlas 2024-11-16 12:22:16 +03:00
parent b1b5fce405
commit 9ba777cdeb
8 changed files with 305 additions and 1 deletions

10
.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
.idea/
.vs/
*.user
/local
bin/
obj/
BetterFirstPerson/obj/
BetterFirstPerson/bin/

22
BetterFirstPerson.sln Normal file
View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.10.35013.160
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterFirstPerson", "BetterFirstPerson\BetterFirstPerson.csproj", "{1A273855-C2D0-40BB-B22C-CE17AA4D0A9B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1A273855-C2D0-40BB-B22C-CE17AA4D0A9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A273855-C2D0-40BB-B22C-CE17AA4D0A9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A273855-C2D0-40BB-B22C-CE17AA4D0A9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A273855-C2D0-40BB-B22C-CE17AA4D0A9B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AssemblySearchPaths>$(AssemblySearchPaths);$(GDWeavePath)/core</AssemblySearchPaths>
</PropertyGroup>
<ItemGroup>
<Reference Include="GDWeave" Private="false"/>
<Reference Include="Serilog" Private="false"/>
</ItemGroup>
<ItemGroup>
<None Include="manifest.json" CopyToOutputDirectory="PreserveNewest"/>
</ItemGroup>
<Target
Name="PostBuild"
AfterTargets="PostBuildEvent"
Condition="'$(GDWeavePath)' != ''">
<Exec
Command="xcopy /Y /I &quot;$(TargetDir)&quot; &quot;$(GDWeavePath)/mods/$(AssemblyName)&quot;"
Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))'"
/>
</Target>
</Project>

View File

@ -0,0 +1,18 @@
using GDWeave;
using Serilog;
using Serilog.Core;
namespace BetterFirstPerson;
public class BetterFirstPersonMod : IMod {
public Config Config;
public BetterFirstPersonMod(IModInterface modInterface) {
this.Config = modInterface.ReadConfig<Config>();
modInterface.Logger.Information("BetterFirstPerson loaded!");
modInterface.RegisterScriptMod(new PlayerPatch(this));
}
public void Dispose() {}
}

View File

@ -0,0 +1,7 @@
using System.Text.Json.Serialization;
namespace BetterFirstPerson;
public class Config {
[JsonInclude] public bool ResetUpDownOnFreecam = false;
}

View File

@ -0,0 +1,213 @@
using GDWeave;
using GDWeave.Godot;
using GDWeave.Godot.Variants;
using GDWeave.Modding;
using Serilog;
using Serilog.Configuration;
namespace BetterFirstPerson;
public class PlayerPatch(BetterFirstPersonMod mod) : IScriptMod
{
public bool ShouldRun(string path) => path == "res://Scenes/Entities/Player/player.gdc";
public IEnumerable<Token> Modify(string path, IEnumerable<Token> tokens)
{
var waiter = new MultiTokenWaiter([
t => t is IdentifierToken{Name: "skeleton"},
t => t.Type is TokenType.Period,
t => t is IdentifierToken{Name: "set_bone_custom_pose" },
t => t.Type is TokenType.ParenthesisOpen,
t => t is ConstantToken{Value: IntVariant{Value:1 } },
t => t.Type is TokenType.Comma,
t => t.Type is TokenType.BuiltInType,
t => t.Type is TokenType.ParenthesisOpen,
t => t.Type is TokenType.ParenthesisClose,
t => t.Type is TokenType.ParenthesisClose,
t => t.Type is TokenType.Newline,
], allowPartialMatch: true);
foreach (var token in tokens)
{
// was useful since GDWeave.Test didn't work for me :p
// mod.logger.Information(token.ToString());
if (waiter.Check(token))
{
yield return new Token(TokenType.Newline, 1);
// fuck me
// if camera_zoom < 0.5 and not freecamming:
yield return new Token(TokenType.CfIf);
yield return new IdentifierToken(TokenType.Identifier, 32, "camera_zoom");
yield return new Token(TokenType.OpLess);
yield return new ConstantToken(new RealVariant(0.5));
yield return new Token(TokenType.OpAnd);
yield return new Token(TokenType.OpNot);
yield return new IdentifierToken(TokenType.Identifier, 134, "freecamming");
yield return new Token(TokenType.Colon);
yield return new Token(TokenType.Newline, 2);
// if state != STATES.FISHING and state != STATES.FISHING_STRUGGLE:
yield return new Token(TokenType.CfIf);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(1)); // 1 - BUSY
yield return new Token(TokenType.OpAnd);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(6)); // 6 - FISHING_CAST
yield return new Token(TokenType.OpAnd);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(7)); // 7 - FISHING
yield return new Token(TokenType.OpAnd);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(9)); // 9 - FISHING_STRUGGLE
yield return new Token(TokenType.OpAnd);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(10)); // 10 - SHOVEL_CAST
yield return new Token(TokenType.OpAnd);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(11)); // 11 - SHOVEL_STRUGGLE
// idk what these are :p
//yield return new Token(TokenType.OpOr);
//yield return new IdentifierToken(TokenType.Identifier, 47, "state");
//yield return new Token(TokenType.OpNotEqual);
//yield return new ConstantToken(new IntVariant(12)); // 12 - NET_CAST
//yield return new Token(TokenType.OpOr);
//yield return new IdentifierToken(TokenType.Identifier, 47, "state");
//yield return new Token(TokenType.OpNotEqual);
//yield return new ConstantToken(new IntVariant(13)); // 13 - NET_STRUGGLE
yield return new Token(TokenType.OpAnd);
yield return new IdentifierToken(TokenType.Identifier, 47, "state");
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new IntVariant(16)); // 16 - SHOVEL_STRUGGLE
yield return new Token(TokenType.Colon);
yield return new Token(TokenType.Newline, 3);
// self.rotation.y = camera.rotation.y
yield return new Token(TokenType.Self);
yield return new Token(TokenType.Period);
yield return new IdentifierToken("rotation");
yield return new Token(TokenType.Period);
yield return new IdentifierToken("y");
yield return new Token(TokenType.OpAssign);
yield return new IdentifierToken(TokenType.Identifier, 137, "camera");
yield return new Token(TokenType.Period);
yield return new IdentifierToken(TokenType.Identifier, 286, "rotation");
yield return new Token(TokenType.Period);
yield return new IdentifierToken(TokenType.Identifier, 288, "y");
yield return new Token(TokenType.Newline, 3);
// var back_bend = clamp(camera.rotation.x * 54, -50.0, 50.0)
yield return new Token(TokenType.PrVar);
yield return new IdentifierToken("back_bend");
yield return new Token(TokenType.OpAssign);
yield return new Token(TokenType.BuiltInFunc, 53);
yield return new Token(TokenType.ParenthesisOpen);
yield return new IdentifierToken(TokenType.Identifier, 137, "camera");
yield return new Token(TokenType.Period);
yield return new IdentifierToken(TokenType.Identifier, 286, "rotation");
yield return new Token(TokenType.Period);
yield return new IdentifierToken(TokenType.Identifier, 288, "x");
yield return new Token(TokenType.OpMul);
yield return new ConstantToken(new IntVariant(54));
yield return new Token(TokenType.Comma);
yield return new ConstantToken(new RealVariant(-50.0));
yield return new Token(TokenType.Comma);
yield return new ConstantToken(new RealVariant(50.0));
yield return new Token(TokenType.ParenthesisClose);
yield return new Token(TokenType.Newline, 3);
// $body / player_body / Armature / Skeleton / BoneAttachment / Spatial.rotation_degrees = Vector3(0.0, camera.rotation.y, back_bend * 0.7)
yield return new Token(TokenType.Dollar);
yield return new IdentifierToken(TokenType.Identifier, 142, "body");
yield return new Token(TokenType.OpDiv);
yield return new IdentifierToken(TokenType.Identifier, 144, "player_body");
yield return new Token(TokenType.OpDiv);
yield return new IdentifierToken(TokenType.Identifier, 145, "Armature");
yield return new Token(TokenType.OpDiv);
yield return new IdentifierToken(TokenType.Identifier, 146, "Skeleton");
yield return new Token(TokenType.OpDiv);
yield return new IdentifierToken(TokenType.Identifier, 597, "BoneAttachment");
yield return new Token(TokenType.OpDiv);
yield return new IdentifierToken(TokenType.Identifier, 598, "Spatial");
yield return new Token(TokenType.Period);
yield return new IdentifierToken(TokenType.Identifier, 342, "rotation_degrees");
yield return new Token(TokenType.OpAssign);
yield return new Token(TokenType.BuiltInType, 7);
yield return new Token(TokenType.ParenthesisOpen);
yield return new ConstantToken(new RealVariant(0.0));
yield return new Token(TokenType.Comma);
yield return new ConstantToken(new RealVariant(0.0));
yield return new Token(TokenType.Comma);
yield return new IdentifierToken("back_bend");
yield return new Token(TokenType.OpMul);
yield return new ConstantToken(new RealVariant(0.7));
yield return new Token(TokenType.ParenthesisClose);
yield return new Token(TokenType.Newline, 3);
// animation_data["back_bend"] = deg2rad( - back_bend)
yield return new IdentifierToken(TokenType.Identifier, 126, "animation_data");
yield return new Token(TokenType.BracketOpen);
yield return new ConstantToken(new StringVariant("back_bend"));
yield return new Token(TokenType.BracketClose);
yield return new Token(TokenType.OpAssign);
yield return new Token(TokenType.BuiltInFunc, 43);
yield return new Token(TokenType.ParenthesisOpen);
yield return new Token(TokenType.OpSub);
yield return new IdentifierToken("back_bend");
yield return new Token(TokenType.ParenthesisClose);
yield return new Token(TokenType.Newline, 1);
if (mod.Config.ResetUpDownOnFreecam)
{
// else:
yield return new Token(TokenType.CfElse);
yield return new Token(TokenType.Colon);
yield return new Token(TokenType.Newline, 2);
// if not freecamming:
yield return new Token(TokenType.CfIf);
yield return new Token(TokenType.OpNot);
yield return new IdentifierToken(TokenType.Identifier, 134, "freecamming");
yield return new Token(TokenType.Colon);
yield return new Token(TokenType.Newline, 3);
// if animation_data["back_bend"] != 0.0:
yield return new Token(TokenType.CfIf);
yield return new IdentifierToken(TokenType.Identifier, 126, "animation_data");
yield return new Token(TokenType.BracketOpen);
yield return new ConstantToken(new StringVariant("back_bend"));
yield return new Token(TokenType.BracketClose);
yield return new Token(TokenType.OpNotEqual);
yield return new ConstantToken(new RealVariant(0.0));
yield return new Token(TokenType.Colon);
yield return new Token(TokenType.Newline, 4);
// animation_data["back_bend"] = 0.0
yield return new IdentifierToken(TokenType.Identifier, 126, "animation_data");
yield return new Token(TokenType.BracketOpen);
yield return new ConstantToken(new StringVariant("back_bend"));
yield return new Token(TokenType.BracketClose);
yield return new Token(TokenType.OpAssign);
yield return new ConstantToken(new RealVariant(0.0));
yield return new Token(TokenType.Newline, 1);
}
}
else
{
yield return token;
}
}
}
}

View File

@ -0,0 +1,4 @@
{
"Id": "BetterFirstPerson",
"AssemblyPath": "BetterFirstPerson.dll"
}

View File

@ -1,3 +1,6 @@
# BetterFirstPerson
a better first person mod for webfishing
better first person mod for webfishing
## what does this mod do
makes the character rotate in first person (includes up and down body bending :3)