All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

254 lines
8.7 KiB

const SMARTTARGET_MODULE_NAME = "smarttarget";
Hooks.on("init", () => {
game.smartTarget = {
altModifier : false,
};
game.settings.register(SMARTTARGET_MODULE_NAME, "targetingMode", {
name: game.i18n.localize("smarttarget.settings.targetingMode.name"),
hint: game.i18n.localize("smarttarget.settings.targetingMode.hint"),
scope: "client",
config: true,
default: 1,
type: Number,
choices: {
0: game.i18n.localize("smarttarget.settings.targetingMode.opt0"),
1: game.i18n.localize("smarttarget.settings.targetingMode.opt1"),
2: game.i18n.localize("smarttarget.settings.targetingMode.opt2"),
},
});
game.settings.register(SMARTTARGET_MODULE_NAME, "release", {
name: game.i18n.localize("smarttarget.settings.releaseBehaviour.name"),
hint: game.i18n.localize("smarttarget.settings.releaseBehaviour.hint"),
scope: "client",
config: true,
default: 0,
type: Number,
choices: {
0: game.i18n.localize("smarttarget.settings.releaseBehaviour.choice0.Standard"),
1: game.i18n.localize("smarttarget.settings.releaseBehaviour.choice0.Sticky")
}
});
game.settings.register(SMARTTARGET_MODULE_NAME, "portraitPips", {
name: game.i18n.localize("smarttarget.settings.portraitPips.name"),
hint: game.i18n.localize("smarttarget.settings.portraitPips.hint"),
scope: "world",
config: true,
default: false,
type: Boolean,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "useToken", {
name: game.i18n.localize("smarttarget.settings.useToken.name"),
hint: game.i18n.localize("smarttarget.settings.useToken.hint"),
scope: "world",
config: true,
default: false,
type: Boolean,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "useTokenGm", {
name: game.i18n.localize("smarttarget.settings.useTokenGm.name"),
hint: game.i18n.localize("smarttarget.settings.useTokenGm.hint"),
scope: "world",
config: true,
default: 0,
type: Number,
choices: {
0: game.i18n.localize("smarttarget.settings.useTokenGm.opt0"),
1: game.i18n.localize("smarttarget.settings.useTokenGm.opt1"),
2: game.i18n.localize("smarttarget.settings.useTokenGm.opt2"),
},
});
game.settings.register(SMARTTARGET_MODULE_NAME, "pipPosition", {
name: game.i18n.localize("smarttarget.settings.pipPosition.name"),
hint: game.i18n.localize("smarttarget.settings.pipPosition.hint"),
scope: "world",
config: true,
default: "topleft",
type: String,
choices: {
"topleft": game.i18n.localize("smarttarget.settings.pipPosition.topleft"),
"topright": game.i18n.localize("smarttarget.settings.pipPosition.topright"),
"bottomleft": game.i18n.localize("smarttarget.settings.pipPosition.bottomleft"),
"bottomright": game.i18n.localize("smarttarget.settings.pipPosition.bottomright"),
"centertop": game.i18n.localize("smarttarget.settings.pipPosition.centertop"),
"centerbottom": game.i18n.localize("smarttarget.settings.pipPosition.centerbottom"),
"random": game.i18n.localize("smarttarget.settings.pipPosition.random"),
},
});
game.settings.register(SMARTTARGET_MODULE_NAME, "insidePips", {
name: game.i18n.localize("smarttarget.settings.insidePips.name"),
hint: game.i18n.localize("smarttarget.settings.insidePips.hint"),
scope: "world",
config: true,
default: false,
type: Boolean,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "pipImgScale", {
name: game.i18n.localize("smarttarget.settings.pipImgScale.name"),
hint: game.i18n.localize("smarttarget.settings.pipImgScale.hint"),
scope: "world",
config: true,
type: Number,
range: {
min: 0.05,
max: 10,
step: 0.05,
},
default: 1,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "pipOffsetManualY", {
name: game.i18n.localize("smarttarget.settings.pipOffsetManualY.name"),
hint: game.i18n.localize("smarttarget.settings.pipOffsetManualY.hint"),
scope: "world",
config: true,
type: Number,
range: {
min: 0,
max: 100,
step: 0.05,
},
default: 0,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "pipOffsetManualX", {
name: game.i18n.localize("smarttarget.settings.pipOffsetManualX.name"),
hint: game.i18n.localize("smarttarget.settings.pipOffsetManualX.hint"),
scope: "world",
config: true,
type: Number,
range: {
min: 0,
max: 100,
step: 0.05,
},
default: 0,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "pipScale", {
name: game.i18n.localize("smarttarget.settings.pipScale.name"),
hint: game.i18n.localize("smarttarget.settings.pipScale.hint"),
scope: "world",
config: true,
type: Number,
range: {
min: 0.05,
max: 100,
step: 0.05,
},
default: 12,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "pipOffset", {
name: game.i18n.localize("smarttarget.settings.pipOffset.name"),
hint: game.i18n.localize("smarttarget.settings.pipOffset.hint"),
scope: "world",
config: true,
type: Number,
range: {
min: 0.05,
max: 100,
step: 0.05,
},
default: 16,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "borderThicc", {
name: game.i18n.localize("smarttarget.settings.borderThicc.name"),
hint: game.i18n.localize("smarttarget.settings.borderThicc.hint"),
scope: "world",
config: true,
type: Number,
range: {
min: 0,
max: 10,
step: 1,
},
default: 2,
});
game.settings.register(SMARTTARGET_MODULE_NAME, "crossairColor", {
name: game.i18n.localize("smarttarget.settings.crossairColor.name"),
hint: game.i18n.localize("smarttarget.settings.crossairColor.hint"),
scope: "client",
config: true,
type: String,
default: "",
});
game.settings.register(SMARTTARGET_MODULE_NAME, "target-indicator", {
name: game.i18n.localize("smarttarget.settings.target-indicator.name"),
hint: game.i18n.localize("smarttarget.settings.target-indicator.hint"),
scope: "client",
config: true,
default: "0",
type: String,
choices: {
0: game.i18n.localize("smarttarget.settings.target-indicator-choices-0"),
1: game.i18n.localize("smarttarget.settings.target-indicator-choices-1"),
2: game.i18n.localize("smarttarget.settings.target-indicator-choices-2"),
3: game.i18n.localize("smarttarget.settings.target-indicator-choices-3"),
4: game.i18n.localize("smarttarget.settings.target-indicator-choices-4"),
5: game.i18n.localize("smarttarget.settings.target-indicator-choices-5"),
},
});
game.settings.register(SMARTTARGET_MODULE_NAME, "use-player-color", {
name: game.i18n.localize("smarttarget.settings.use-player-color.name"),
hint: game.i18n.localize("smarttarget.settings.use-player-color.hint"),
scope: "world",
config: true,
default: false,
type: Boolean,
});
libWrapper.register(SMARTTARGET_MODULE_NAME,"Token.prototype._refreshTarget", SmartTarget._refreshTarget, "MIXED");
libWrapper.register(SMARTTARGET_MODULE_NAME, "Token.prototype._onClickLeft", SmartTarget._tokenOnClickLeft, "MIXED");
libWrapper.register(SMARTTARGET_MODULE_NAME, "Canvas.prototype._onClickLeft", SmartTarget.canvasOnClickLeft, "WRAPPER");
libWrapper.register(SMARTTARGET_MODULE_NAME, "Token.prototype._canControl", SmartTarget._canControl, "MIXED");
Hooks.on("getSceneControlButtons", function(controls) {
let control = controls.find(c => c.name === 'token') || controls[0];
control.tools.push({
name: 'clearTargets',
title: game.i18n.localize("smarttarget.controls.cleartargets.name"),
icon:'fa fa-times-circle',
button:true,
onClick: () => {
canvas.tokens.placeables[0]?.setTarget(false, { releaseOthers: true });
},
layer: 'TokenLayer'
});
},);
const {SHIFT, CONTROL, ALT} = KeyboardManager.MODIFIER_KEYS;
game.keybindings.register(SMARTTARGET_MODULE_NAME, "altKey", {
name: game.i18n.localize("smarttarget.keybindings.altkey"),
editable: [
{key: "AltLeft"},
{key: "AltRight"},
],
onDown: () => {game.smartTarget.altModifier = true;},
onUp: () => {game.smartTarget.altModifier = false;},
});
game.keybindings.register(SMARTTARGET_MODULE_NAME, "clearAllTargets", {
name: game.i18n.localize("smarttarget.keybindings.clearAllTargets"),
editable: [
{key: "KeyC", modifiers: [ ALT ]}
],
onDown: () => {canvas.tokens.placeables[0]?.setTarget(false, { releaseOthers: true });},
});
});