#include "rhs_include" #include "nwnx_events" #include "x2_inc_switches" #include "zzdlg_main_inc" void main() { object oPC; object oTarget; object oArea; location lTargetLocation; // Linux if(RHS_USING_LINUX) { oPC = OBJECT_SELF; oArea = GetArea(oPC); oTarget = GetEventTarget(); vector vPosition = GetEventPosition(); lTargetLocation = Location(oArea, vPosition, 0.0); } // Windows else { if (GetUserDefinedItemEventNumber() != X2_ITEM_EVENT_ACTIVATE) return; oPC = GetItemActivator(); oArea = GetArea(oPC); oTarget = GetItemActivatedTarget(); lTargetLocation = GetItemActivatedTargetLocation(); } object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iAreaPCID = GetLocalInt(oArea, RHS_HOUSE_OWNER_ID_NUMBER); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); // Check if oPC is trying to move furniture int bMovingFurniture = GetLocalInt(oPC, RHS_FURNITURE_MOVING_OBJECT); if(bMovingFurniture) { object oFurnitureBeingMoved = GetLocalObject(oPC, RHS_FURNITURE_MOVING_OBJECT_REFERENCE); object oFurnitureArea = GetArea(oFurnitureBeingMoved); // Invalid object or the wrong area - remove temporary variables and inform user if(!GetIsObjectValid(oFurnitureBeingMoved) || oFurnitureArea != GetAreaFromLocation(lTargetLocation)) { FloatingTextStringOnCreature(ColorTokenRed() + "Error! Cannot move that object to that location." + ColorTokenEnd(), oPC, FALSE); DeleteLocalInt(oPC, RHS_FURNITURE_MOVING_OBJECT); DeleteLocalObject(oPC, RHS_FURNITURE_MOVING_OBJECT_REFERENCE); return; } // Otherwise, move the object to the new location and update the database else { string sResref = GetResRef(oFurnitureBeingMoved); float fFacing = GetFacing(oFurnitureBeingMoved); RHS_RemoveFurniture(OBJECT_INVALID, oFurnitureBeingMoved, iAreaPCID); RHS_ClearInventory(oFurnitureBeingMoved); DestroyObject(oFurnitureBeingMoved); oFurnitureBeingMoved = CreateObject(OBJECT_TYPE_PLACEABLE, sResref, lTargetLocation); AssignCommand(oFurnitureBeingMoved, SetFacing(fFacing)); DelayCommand(0.2, RHS_AddFurniture(OBJECT_INVALID, oFurnitureBeingMoved, iAreaPCID)); } } // Area is either a preview or a non-house area - inform player they can't manipulate furniture if(iAreaPCID <= 0) { FloatingTextStringOnCreature(ColorTokenRed() + "Furniture can only be manipulated in player-owned " + RHS_HOUSE_TERM_LOWER_PLURAL + ".", oPC, FALSE); return; } // Check if oPC is a 'Trustee'. Trustees are able to manipulate furniture in other people's houses if(iAreaPCID != iPCID) { string sTable = RHS_TABLE_FRIENDS + IntToString(iAreaPCID); string sPermission = GetMySQLData(sTable, "Setting", iPCID, "ID", RHS_SCHEMA); // Not a trustee - inform player they cannot manipulate furniture if(sPermission != "T") { FloatingTextStringOnCreature(ColorTokenRed() + "You do not have sufficient permissions to perform that action." + ColorTokenEnd(), oPC, FALSE); return; } } // If the target was an object, use that object's location if(GetIsObjectValid(oTarget)) { lTargetLocation = GetLocation(oTarget); } // By this point either oPC is the owner or is a trustee. They are allowed to access the furniture management menu. // Store necessary variables for later retrieval and execute the furniture menu SetLocalString(oPC, RHS_FURNITURE_TOOL_TARGET_LOCATION, APSLocationToString(lTargetLocation)); _dlgStart(oPC, oDatabase, RHS_FURNITURE_MENU, 1, 1, 1); }