176 lines
5.3 KiB
C#
176 lines
5.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class ConsoleCmdCalibrateWeapon : ConsoleCmdAbstract
|
|
{
|
|
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo)
|
|
{
|
|
if (!_senderInfo.IsLocalGame || _params.Count < 2)
|
|
{
|
|
Log.Error("too few params: expecting 2 at least");
|
|
return;
|
|
}
|
|
|
|
bool flag = Enum.TryParse<CalibrateType>(_params[0], out var calType);
|
|
if (!flag)
|
|
{
|
|
Log.Error("Only following commands are valid: " + string.Join(",", Enum.GetNames(typeof(CalibrateType))));
|
|
return;
|
|
}
|
|
|
|
flag = Enum.TryParse<TweakType>(_params[1], out var tweakType);
|
|
if (!flag)
|
|
{
|
|
Log.Error("Only following tweak type are valid: " + String.Join(",", Enum.GetNames(typeof(TweakType))));
|
|
return;
|
|
}
|
|
|
|
Transform targetTrans = null;
|
|
var inv = GameManager.Instance.World.GetPrimaryPlayer().inventory;
|
|
if (calType != CalibrateType.offset)
|
|
{
|
|
var weaponTrans = inv.GetHoldingItemTransform();
|
|
if (weaponTrans == null)
|
|
{
|
|
Log.Error("player is not holding anything!");
|
|
return;
|
|
}
|
|
|
|
targetTrans = weaponTrans.Find(_params[2]);
|
|
if (targetTrans == null)
|
|
{
|
|
Log.Error("transform not found on weapon!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
Vector3 param = Vector3.zero;
|
|
if (tweakType != TweakType.log)
|
|
{
|
|
int parseIndex;
|
|
if (calType != CalibrateType.offset)
|
|
{
|
|
parseIndex = 3;
|
|
if (_params.Count < 4)
|
|
{
|
|
Log.Error("relative or absolute value is required to calibrate!");
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
parseIndex = 2;
|
|
if (_params.Count < 3)
|
|
{
|
|
Log.Error("offset value is required to calibrate!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (_params.Count < parseIndex + 2)
|
|
param = StringParsers.ParseVector3(_params[parseIndex]);
|
|
else if (_params.Count == parseIndex + 2)
|
|
{
|
|
flag = float.TryParse(_params[parseIndex + 1], out float value);
|
|
if (!flag)
|
|
{
|
|
Log.Error("offset value is NAN!");
|
|
return;
|
|
}
|
|
|
|
switch (_params[parseIndex])
|
|
{
|
|
case "x":
|
|
param.x = value;
|
|
break;
|
|
case "y":
|
|
param.y = value;
|
|
break;
|
|
case "z":
|
|
param.z = value;
|
|
break;
|
|
default:
|
|
Log.Error("must specify x/y/z axis!");
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Log.Error("too many params!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
switch (calType)
|
|
{
|
|
case CalibrateType.pos:
|
|
targetTrans.localPosition = DoCalibrate(tweakType, targetTrans.localPosition, param);
|
|
break;
|
|
case CalibrateType.rot:
|
|
targetTrans.localEulerAngles = DoCalibrate(tweakType, targetTrans.localEulerAngles, param);
|
|
break;
|
|
case CalibrateType.scale:
|
|
targetTrans.localScale = DoCalibrate(tweakType, targetTrans.localScale, param);
|
|
break;
|
|
case CalibrateType.offset:
|
|
//var zoomAction = Convert.ChangeType(inv.holdingItemData.actionData[1], typeof(ItemActionZoom).GetNestedType("ItemActionDataZoom", System.Reflection.BindingFlags.NonPublic));
|
|
if (!(inv.holdingItemData.actionData[1] is ItemActionZoom.ItemActionDataZoom zoomAction))
|
|
{
|
|
Log.Error("holding item can not aim!");
|
|
return;
|
|
}
|
|
zoomAction.ScopeCameraOffset = DoCalibrate(tweakType, zoomAction.ScopeCameraOffset, param);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private Vector3 DoCalibrate(TweakType type, Vector3 origin, Vector3 param)
|
|
{
|
|
Vector3 res = origin;
|
|
switch (type)
|
|
{
|
|
case TweakType.abs:
|
|
res = param;
|
|
break;
|
|
case TweakType.rel:
|
|
res = origin + param;
|
|
break;
|
|
case TweakType.log:
|
|
Log.Out(res.ToString("F6"));
|
|
break;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public override string[] getCommands()
|
|
{
|
|
return new string[] { "calibrate", "calib" };
|
|
}
|
|
|
|
public override string getDescription()
|
|
{
|
|
return "adjust weapon transform rotation, position, scale, scope offset in game and print current value for xml editing purpose.";
|
|
}
|
|
|
|
public override bool IsExecuteOnClient => true;
|
|
|
|
public override int DefaultPermissionLevel => 1000;
|
|
|
|
private enum CalibrateType
|
|
{
|
|
pos,
|
|
rot,
|
|
scale,
|
|
offset
|
|
}
|
|
|
|
private enum TweakType
|
|
{
|
|
abs,
|
|
rel,
|
|
log
|
|
}
|
|
}
|
|
|