About this mod
This mod makes it easier to move objects like items, and allows you to move objects you were previously not able to.
- Requirements
- Permissions and credits
- Changelogs
I always told the way you can move items in Skyrim is pretty clunky, this mod aims to fix that. Using a configurable key, you can pick up any item to change its location. You can also translate and rotate the item relative to the cursor. This mod allows you to move more than just items, and it is all configurable.
There is also a simple api for both papyrus and SKSE Developers that allows you to start the pickup of an item programmatically.
Default settings
- You can only place flora and trees on dirt and grass ground, but not on other forms
Limitations:
- You cannot leave the room you are in while moving a item.
You can middle-click and object with the mouse to start dragging it
While you are dragging an object
Mouse Right button: Cancel the drag and return the object to its original position and orientation
Mouse Left button: Stop dragging the object and make so it takes its new position and orientation
Control: While pressed you can rotate the object horizontally with the mouse
Shift: While pressed, you can move the object vertically with the mouse
Tab: Reset object orientation and transform
Space bar: Toggle advanced mode, while on advanced mode, you will be able to both move and rotate the object horizontally and vertically
#Action, Device, Key,
Pick, Mouse, MiddleButton
Cancel, Mouse, RightButton
Commit, Mouse, LeftButton
Rotate, Keyboard, RightControl
Rotate, Keyboard, LeftControl
Move, Keyboard, RightShift
Move, Keyboard, LeftShift
ToggleAdvancedMode, Keyboard, Spacebar
ResetTransform, Keyboard, Tab
Here is a list of all the possible keywords for the previus csv table
mouse
gamepad
Keyboard key list
num1
num2
num3
num4
num5
num6
num7
num8
num9
num0
minus
equals
backspace
tab
q
w
e
r
t
y
u
i
o
p
bracketleft
bracketright
enter
leftcontrol
a
s
d
f
g
h
j
k
l
semicolon
apostrophe
tilde
leftshift
backslash
z
x
c
v
b
n
m
comma
period
slash
rightshift
kp_multiply
leftalt
spacebar
capslock
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
numlock
scrolllock
kp_7
kp_8
kp_9
kp_subtract
kp_4
kp_5
kp_6
kp_plus
kp_1
kp_2
kp_3
kp_0
kp_decimal
f11
f12
kp_enter
rightcontrol
kp_divide
printscreen
rightalt
pause
home
up
pageup
left
right
end
down
pagedown
insert
delete
leftwin
rightwin
Mouse Button List
rightbutton
middlebutton
button3
button4
button5
button6
button7
wheelup
wheeldown
Gamepad button list
down
left
right
start
back
leftthumb
rightthumb
leftshoulder
rightshoulder
a
b
x
y
lefttrigger
righttrigger
Papyrus
Example
function StartDraggingObject(ObjectReference object) global native
Usage Example
ObjectReference ref = player.PlaceAtMe(PlaceForm)
ObjectManipulationOverhaul.StartDraggingObject(ref)
SKSE
Example
#include <windows.h>
namespace ObjectManipulationOverhaul {
inline void StartDraggingObject(RE::TESObjectREFR* ref) {
using func_t = void(*)(RE::TESObjectREFR*);
static auto ObjectManipulationOverhaul = GetModuleHandle(L"ObjectManipulationOverhaul");
func_t func = reinterpret_cast<func_t>(GetProcAddress(ObjectManipulationOverhaul, "StartDraggingObject"));
return func(ref);
}
}
Usage example
if (auto refptr = player->PlaceObjectAtMe(AddBoundObject, false)) {
if (auto ref = refptr.get()) {
ObjectManipulationOverhaul::StartDraggingObject(ref);
}
}
There are two file types, one for what objects can be picked and the other for where they can be placed.
The files must be suffixed with: _PICK.json, and for placing with _PLACE.json.
Place Example
{
"Action": "Add",
"Priority": 200,
"ApplyTo": {
"Type":"FormType",
"Values": ["Flora", "Tree"]
},
"OnTarget": {
"Type":"GroundTexture",
"Values": ["Grass","Dirt"]
}
}
]
[
{
"Action": "Remove",
"Priority": 100,
"ApplyTo": {
"Type":"FormType",
"Values": ["MovableStatic", "Static", "Door", "NPC"]
}
},
]
On both files, each item of that array is a rule that will be applied according to the priority, lower priority rules will happen first, and are more likely to be overridden
They also have an action, that means if the rule will allow or disallow the action. These options can be "Add" and "Remove"
There is also the ApplyTo and OnTarget, that follow the same rule. To apply to will choose which form the rule will take effect, while the on target is used to specify where the form can be placed or not.
Examples
"Type": "All"
}
"ApplyTo": {
"Type":"FormId",
"Values": ["135BA"]
}
"ApplyTo": {
"Type":"FormId",
"ModName": "ccbgssse005-goldbrand.esl",
"Values": ["809"]
}
"ApplyTo": {
"Type":"FormType",
"Values": ["MovableStatic", "Static", "Door", "NPC"]
}
"ApplyTo": {
"Type": "ModelPath",
"Values": [
"Furniture",
"Clutter",
"Architecture/WhiteRun/WRClutter",
"Architecture/Riften/Clutter",
"Architecture/SkyHavenTemple/Clutter",
"Architecture/Solitude/Clutter"
]
}
"OnTarget": {
"Type":"GroundTexture",
"Values": ["Grass","Dirt"]
}
Form Type List
formgroup
gamesetting
keyword
locationreftype
action
textureset
menuicon
global
class
faction
headpart
eyes
race
sound
acousticspace
skill
magiceffect
script
landtexture
enchantment
spell
scroll
activator
talkingactivator
armor
book
container
door
ingredient
light
misc
apparatus
static
staticcollection
movablestatic
grass
tree
flora
furniture
weapon
ammo
npc
levelednpc
keymaster
alchemyitem
idlemarker
note
constructibleobject
projectile
hazard
soulgem
leveleditem
weather
climate
shaderparticlegeometrydata
referenceeffect
region
navigation
cell
reference
actorcharacter
projectilemissile
projectilearrow
projectilegrenade
projectilebeam
projectileflame
projectilecone
projectilebarrier
placedhazard
worldspace
land
navmesh
tlod
dialogue
info
quest
idle
package
combatstyle
loadscreen
leveledspell
animatedobject
water
effectshader
toft
explosion
debris
imagespace
imageadapter
formlist
perk
bodypartdata
addonnode
actorvalueinfo
camerashot
camerapath
voicetype
materialtype
impact
impactdataset
armature
encounterzone
location
message
ragdoll
defaultobject
lightingmaster
musictype
footstep
footstepset
storymanagerbranchnode
storymanagerquestnode
storymanagereventnode
dialoguebranch
musictrack
dialogueview
wordofpower
shout
equipslot
relationship
scene
associationtype
outfit
artobject
materialobject
movementtype
soundrecord
dualcastdata
soundcategory
soundoutputmodel
collisionlayer
colorform
reverbparam
lensflare
lenssprite
volumetriclighting
Material ID List (for ground texture)
stonebroken
blockblade1hand
meat
carriagewheel
metallight
woodlight
snow
gravel
chainmetal
bottle
wood
ash
skin
blockblunt
dlc1deerskin
insect
barrel
ceramicmedium
basket
ice
glassstairs
stonestairs
water
draugrskeleton
blade1hand
book
carpet
metalsolid
axe1hand
blockblade2hand
organiclarge
amulet
woodstairs
mud
bouldersmall
snowstairs
stoneheavy
dragonskeleton
trap
bowsstaves
alduin
blockbowsstaves
woodasstairs
steelgreatsword
grass
boulderlarge
stoneasstairs
blade2hand
bottlesmall
boneactor
sand
metalheavy
dlc1sabrecatpelt
iceform
dragon
blade1handsmall
skinsmall
potspans
skinskeleton
blunt1hand
stonestairsbroken
skinlarge
organic
bone
woodheavy
chain
dirt
ghost
skinmetallarge
blockaxe
armorlight
shieldlight
coin
blockblunt2hand
shieldheavy
armorheavy
arrow
glass
stone
waterpuddle
cloth
skinmetalsmall
ward
web
trailersteelsword
blunt2hand
dlc1swingingbridge
bouldermedium
I have also based my ray collector from the one in SmoothCam
Teleportation spell: You can set up to 30 named anchors and then teleport to them whenever you want, you can also go back to your original location.
Magic Storage: You have a magical storage that you can access via a spell, however it.
reduces your health by one tent of its items weight (configurable).
Reusable Consumables: A work in progress mod that allows you to use consumables more than once.
For modders:
SKSE Menu Framework: Allow SKSE mods to create their own menus on a unified mod control panel
DPF - Dynamic Persistent Forms: Allows papyrus scripts to create new forms at runtime, just like player-crafted potions.
Atronach Forge Fix: Fixes the script to handle recipes in a way that you can use the same item more than one time.
BBCode Papyrus Coloring (Nexus forums): You can color your own papyrus code snippets with this web app.