> ## Documentation Index
> Fetch the complete documentation index at: https://docs.projectx.gg/llms.txt
> Use this file to discover all available pages before exploring further.

# Contracts System

> Learn how to configure and add custom contracts for House Robbery V2

## What Are Contracts?

Contracts are optional side tasks that players can accept from NPCs located around the map. These contracts add variety to house robberies by giving players specific objectives like breaking objects, stealing items, or littering. Contracts spawn randomly inside houses and reward players upon completion.

<Info>
  Contracts are configured in `config/contracts.lua` and provide an additional layer of gameplay beyond standard house robberies.
</Info>

## Global Configuration

### Basic Settings

<ParamField path="Enable" type="boolean" required>
  Enable or disable the entire contracts system. When disabled, contract NPCs won't spawn and contracts won't appear in houses.
</ParamField>

<ParamField path="HideRewardsOnDialogs" type="boolean" default="false">
  If `true`, reward amounts are hidden in the contract acceptance dialog. Players won't see the exact payout until they complete the contract.
</ParamField>

### Required Items

Configure which items players need to complete different contract types:

<ParamField path="RequiredItems['Break Objects']" type="string or boolean" default="melee">
  Item required to break objects. Use `"melee"` to allow any melee weapon, a specific item name, or `false` for no requirement.
</ParamField>

<ParamField path="RequiredItems['Steal Objects']" type="string or boolean" default="bag">
  Item required to steal objects. Set to a specific item name or `false` for no requirement.
</ParamField>

<ParamField path="RequiredItems['Littering']" type="string or boolean" default="false">
  Item required for littering contracts. Set to a specific item name or `false` for no requirement.
</ParamField>

<ParamField path="RequiredItems['TakingPictures']" type="string or boolean" default="x_burner">
  Item required to take pictures of completed contracts. Using `"x_burner"` is recommended for immersion with the messaging system.
</ParamField>

**Example:**

```lua theme={null}
["RequiredItems"] = {
    ["Break Objects"] = "melee",
    ["Steal Objects"] = "bag",
    ["Littering"] = false,
    ["TakingPictures"] = "x_burner"
}
```

***

## Contract NPCs

NPCs are the characters players interact with to accept and turn in contracts. You can set up multiple npc coords which allows the npc to spawn randomly at one of the locations instead of always spawning in one spot.

### NPC Configuration

<ParamField path="Peds[n].PedModel" type="string" required>
  The ped model to use for the contract NPC. Example: `"g_m_y_korean_01"`
</ParamField>

<ParamField path="Peds[n].Coords" type="vector4" required>
  Position and heading where the NPC spawns
</ParamField>

<ParamField path="Peds[n].Scenario" type="string">
  Scenario animation for the NPC (standing, sitting, etc.). Example: `"WORLD_HUMAN_STAND_IMPATIENT_UPRIGHT"`

  Use this OR Animation, not both.
</ParamField>

<ParamField path="Peds[n].Animation" type="table">
  Custom animation for the NPC with `Dict` and `Anim` properties

  Use this OR Scenario, not both.
</ParamField>

<Info>
  You can use either `Scenario` (simpler, just a scenario name) or `Animation` (more control with dict/anim), but not both at the same time.
</Info>

**Example with Scenario:**

```lua theme={null}
["Peds"] = {
    {
        ["PedModel"] = "g_m_y_korean_01",
        ["Coords"] = vector4(1023.52, -1870.82, 30.89, 359.91),
        ["Scenario"] = "WORLD_HUMAN_STAND_IMPATIENT_UPRIGHT"
    }
}
```

**Example with Animation:**

```lua theme={null}
["Peds"] = {
    {
        ["PedModel"] = "g_m_y_korean_01",
        ["Coords"] = vector4(-22.72, -1250.14, 29.23, 359.6),
        ["Animation"] = {Dict = "anim@amb@casino@hangout@ped_male@stand@02b@idles", Anim = "idle_a"}
    }
}
```

***

## Dialog Configuration

Customize the text that appears when players interact with contract NPCs.

### Initial Dialog

<ParamField path="DialogTexts.InitialDialog.Content" type="string" required>
  The first message shown when approaching the NPC
</ParamField>

<ParamField path="DialogTexts.InitialDialog.Confirm" type="string" required>
  Text for the accept button
</ParamField>

<ParamField path="DialogTexts.InitialDialog.Cancel" type="string" required>
  Text for the decline button
</ParamField>

### Accepting Contracts

<ParamField path="DialogTexts.AcceptingContracts.Content" type="string" required>
  Message shown when viewing available contracts
</ParamField>

<ParamField path="DialogTexts.AcceptingContracts.Confirm" type="string" required>
  Text for the accept contracts button
</ParamField>

<ParamField path="DialogTexts.AcceptingContracts.Cancel" type="string" required>
  Text for the decline button
</ParamField>

### End Conversation

<ParamField path="DialogTexts.EndConversation.Content" type="string" required>
  Final message after accepting contracts
</ParamField>

<ParamField path="DialogTexts.EndConversation.Confirm" type="string" required>
  Text for the goodbye button
</ParamField>

**Example:**

```lua theme={null}
["DialogTexts"] = {
    ["InitialDialog"] = {
        ["Content"] = "I have some contracts, would you like to take a look? I will give u a reward for each one you complete.",
        ["Confirm"] = "Sure",
        ["Cancel"] = "No, thanks, I'll think about it"
    },
    ["AcceptingContracts"] = {
        ["Content"] = "Here are the available contracts:",
        ["Confirm"] = "Accept Contracts",
        ["Cancel"] = "Maybe later"
    },
    ["EndConversation"] = {
        ["Content"] = "Bring back the items I asked for, or take a picture (Breaking or Littering) with your burner phone, then come back for your reward.",
        ["Confirm"] = "Will do, Goodbye"
    }
}
```

***

## Contract Types

There are three types of contracts, each with unique mechanics and configuration options.

### 1. Steal Objects Contracts

Players must steal specific items from houses and return them to the NPC.

<ParamField path="Label" type="string" required>
  Contract title shown in the UI
</ParamField>

<ParamField path="Description" type="string" required>
  Contract description shown in the UI
</ParamField>

<ParamField path="Icon" type="string" required>
  Font Awesome icon for the contract. Example: `"fas fa-briefcase"`
</ParamField>

<ParamField path="Model" type="string" required>
  Prop model that spawns in the house
</ParamField>

<ParamField path="Animation" type="table" required>
  Animation configuration with `Dict` and `Anim` properties OR `Scenario` property (use one or the other)
</ParamField>

<ParamField path="DelayUntilCancelled" type="number" required>
  Seconds before the animation stops
</ParamField>

<ParamField path="TurnToFaceProp" type="boolean" required>
  If `true`, player turns to face the prop before interacting
</ParamField>

<ParamField path="AnimationProp" type="table">
  Optional prop attached to player during animation with `Model`, `Bone`, `Offset`, and `Rotation`
</ParamField>

<ParamField path="Reward" type="table" required>
  Reward configuration including `Exp`, `Type` (money/item), `Item`, `Amount` (min/max), and `MetaData`
</ParamField>

**Example:**

```lua theme={null}
["Steal Objects"] = {
    ["Briefcase"] = {
        ["Label"] = "Snatch the Briefcase",
        ["Description"] = "Sneak in and grab the briefcase",
        ["Icon"] = "fas fa-briefcase",
        ["Model"] = "prop_ld_case_01",
        ["Animation"] = {Dict = "random@domestic", Anim = "pickup_low"},
        ["DelayUntilCancelled"] = 1,
        ["TurnToFaceProp"] = false,
        ["AnimationProp"] = {
            ["Model"] = "prop_ld_case_01",
            ["Bone"] = 57005,
            ["Offset"] = vector3(0.1, 0.0, -0.03),
            ["Rotation"] = vector3(-90.0, 0.0, 0.0)
        },
        ["Reward"] = {
            ["Exp"] = 20,
            ["Type"] = "money",
            ["Item"] = "",
            ["Amount"] = {min = 275, max = 300},
            ["MetaData"] = false
        }
    }
}
```

**Example with Scenario instead of Animation:**

```lua theme={null}
["Steal Objects"] = {
    ["Documents"] = {
        ["Label"] = "Grab the Documents",
        ["Description"] = "Pick up the important papers",
        ["Icon"] = "fas fa-file",
        ["Model"] = "prop_paper_bag_small",
        ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
        ["DelayUntilCancelled"] = 2,
        ["TurnToFaceProp"] = false,
        ["Reward"] = {
            ["Exp"] = 15,
            ["Type"] = "money",
            ["Item"] = "",
            ["Amount"] = {min = 200, max = 250},
            ["MetaData"] = false
        }
    }
}
```

### 2. Break Objects Contracts

Players must break specific objects and take a picture as proof.

<ParamField path="Model" type="string" required>
  Prop model for the intact object
</ParamField>

<ParamField path="BrokenModel" type="string" required>
  Prop model that replaces the intact object after breaking
</ParamField>

<ParamField path="Sound" type="string" required>
  Sound effect when breaking: `"glass"`, `"electronics"`, `"thud"`, or `false` for no sound
</ParamField>

<ParamField path="Animation.Breaking" type="table" required>
  Animation configuration for breaking the object including `Animation` (with `Dict` and `Anim`) OR `Scenario`, `DelayUntilCancelled`, `TurnToFaceProp`, and optional `AnimationProp`
</ParamField>

<ParamField path="Animation.TakingPicture" type="table" required>
  Animation configuration for taking the picture including `Animation` (with `Dict` and `Anim`) OR `Scenario`, `DelayUntilCancelled`, `TurnToFaceProp`, and optional `AnimationProp`
</ParamField>

**Example:**

```lua theme={null}
["Break Objects"] = {
    ["Laptop"] = {
        ["Label"] = "Smash the Laptop's Screen",
        ["Description"] = "Teach this overpriced laptop a lesson.",
        ["Icon"] = "fas fa-laptop",
        ["Model"] = "prop_laptop_lester",
        ["BrokenModel"] = "gr_prop_gr_laptop_01c",
        ["Sound"] = "electronics",
        ["Animation"] = {
            ["Breaking"] = {
                ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                ["DelayUntilCancelled"] = 1,
                ["TurnToFaceProp"] = false
            },
            ["TakingPicture"] = {
                ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
                ["DelayUntilCancelled"] = 4,
                ["TurnToFaceProp"] = false
            }
        },
        ["Reward"] = {
            ["Exp"] = 20,
            ["Type"] = "money",
            ["Item"] = "",
            ["Amount"] = {min = 275, max = 300},
            ["MetaData"] = false
        }
    }
}
```

### 3. Littering Contracts

Players must pick up an object, scatter litter, and take a picture as proof.

<ParamField path="Model" type="string" required>
  Prop model for the initial item to pick up
</ParamField>

<ParamField path="LitteredModel" type="string" required>
  Prop model that spawns as scattered litter
</ParamField>

<ParamField path="Sound" type="string">
  Sound effect when littering: `"poop"`, `"spill"`, `"trash"`, or `false` for no sound
</ParamField>

<ParamField path="Animation.Pickup" type="table" required>
  Animation for picking up the initial object (can use `Animation` with `Dict`/`Anim` OR `Scenario`)
</ParamField>

<ParamField path="Animation.Litter" type="table" required>
  Animation for scattering the litter (can use `Animation` with `Dict`/`Anim` OR `Scenario`)
</ParamField>

<ParamField path="Animation.TakingPicture" type="table" required>
  Animation for taking the picture proof (can use `Animation` with `Dict`/`Anim` OR `Scenario`)
</ParamField>

**Example:**

```lua theme={null}
["Littering"] = {
    ["Cans"] = {
        ["Label"] = "Scatter cans",
        ["Description"] = "Scatter cans around like you own the place.",
        ["Icon"] = "fas fa-trash-can",
        ["Model"] = "v_ret_247_popcan2",
        ["LitteredModel"] = "prop_rub_litter_01",
        ["Sound"] = "trash",
        ["Animation"] = {
            ["Pickup"] = {
                ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                ["DelayUntilCancelled"] = 1,
                ["TurnToFaceProp"] = false
            },
            ["Litter"] = {
                ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                ["DelayUntilCancelled"] = 3,
                ["TurnToFaceProp"] = false
            },
            ["TakingPicture"] = {
                ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
                ["DelayUntilCancelled"] = 4,
                ["TurnToFaceProp"] = false
            }
        },
        ["Reward"] = {
            ["Exp"] = 15,
            ["Type"] = "money",
            ["Item"] = "",
            ["Amount"] = {min = 200, max = 250},
            ["MetaData"] = false
        }
    }
}
```

Players must also take pictures of specific objects or situations. This is tied to Breaking and Littering contracts as proof of completion.

***

## Reward Configuration

All contracts share the same reward structure:

<ParamField path="Reward.Exp" type="number" required>
  Experience points awarded upon completion (if using an XP system)
</ParamField>

<ParamField path="Reward.Type" type="string" required>
  Type of reward: `"money"` for direct cash or `"item"` for inventory items
</ParamField>

<ParamField path="Reward.Item" type="string">
  Item name if `Type = "item"`. Leave empty if `Type = "money"`
</ParamField>

<ParamField path="Reward.Amount" type="table" required>
  Reward amount with `min` and `max` values for randomization
</ParamField>

<ParamField path="Reward.MetaData" type="boolean" required>
  If `true`, adds metadata to the reward item (used for marked money or item info)
</ParamField>

**Money Reward Example:**

```lua theme={null}
["Reward"] = {
    ["Exp"] = 20,
    ["Type"] = "money",
    ["Item"] = "",
    ["Amount"] = {min = 275, max = 300},
    ["MetaData"] = false
}
```

**Item Reward Example:**

```lua theme={null}
["Reward"] = {
    ["Exp"] = 15,
    ["Type"] = "item",
    ["Item"] = "markedbills",
    ["Amount"] = {min = 1, max = 3},
    ["MetaData"] = true
}
```

***

## Animation Props

Animation props are optional attachments that appear on the player during animations, making interactions more immersive.

<ParamField path="AnimationProp.Model" type="string" required>
  Prop model to attach to the player
</ParamField>

<ParamField path="AnimationProp.Bone" type="number" required>
  Bone ID where the prop attaches. Common bones:

  * `57005` - Head
  * `18905` - Left hand
  * `60309` - Right hand
  * `24817` - Weapon slot
</ParamField>

<ParamField path="AnimationProp.Offset" type="vector3" required>
  Position offset from the bone attachment point
</ParamField>

<ParamField path="AnimationProp.Rotation" type="vector3" required>
  Rotation angles for the prop in degrees
</ParamField>

**Example:**

```lua theme={null}
["AnimationProp"] = {
    ["Model"] = "prop_ld_case_01",
    ["Bone"] = 57005,
    ["Offset"] = vector3(0.1, 0.0, -0.03),
    ["Rotation"] = vector3(-90.0, 0.0, 0.0)
}
```

<Info>
  Remove the entire `AnimationProp` table if you don't want a prop to appear during the animation.
</Info>

***

## Adding Contracts to Presets

Contracts are linked to house presets. In your preset configuration, specify which contracts can spawn:

```lua theme={null}
["Contracts"] = {
    ["ChanceOfSpawning"] = 100,
    ["PossibleContracts"] = {
        ["1"] = {
            ["Contract"] = "Briefcase",
            ["Type"] = "Steal Objects",
            ["PickupCoords"] = vector3(-764.00, 321.12, 199.17),
            ["PickupRotation"] = vector3(0.0, 0.0, 343.53)
        },
        ["2"] = {
            ["Contract"] = "Laptop",
            ["Type"] = "Break Objects",
            ["PickupCoords"] = vector3(-772.97, 328.25, 195.91),
            ["PickupRotation"] = vector3(0.0, 0.0, 227.85)
        },
        ["3"] = {
            ["Contract"] = "Cans",
            ["Type"] = "Littering",
            ["PickupCoords"] = vector3(-764.00, 321.12, 199.17),
            ["PickupRotation"] = vector3(0.0, 0.0, 343.53),
            ["LitteredCoords"] = vector3(-764.00, 321.12, 199.17),
            ["LitteredRotation"] = vector3(0.0, 0.0, 343.53)
        }
    }
}
```

See the [Presets Guide](/resources/house-robbery-v2/guides/presets#contracts) for detailed preset configuration.

***

## Complete Configuration Example

<Accordion title="View Complete Contracts Configuration">
  ```lua theme={null}
  Config.Contracts = {
      ["Enable"] = true,
      ["HideRewardsOnDialogs"] = false,
      
      ["RequiredItems"] = {
          ["Break Objects"] = "melee",
          ["Steal Objects"] = "bag",
          ["Littering"] = false,
          ["TakingPictures"] = "x_burner"
      },
      
      ["Peds"] = {
          {
              ["PedModel"] = "g_m_y_korean_01",
              ["Coords"] = vector4(1023.52, -1870.82, 30.89, 359.91),
              ["Scenario"] = "WORLD_HUMAN_STAND_IMPATIENT_UPRIGHT"
          }
      },
      
      ["DialogTexts"] = {
          ["InitialDialog"] = {
              ["Content"] = "I have some contracts, would you like to take a look? I will give u a reward for each one you complete.",
              ["Confirm"] = "Sure",
              ["Cancel"] = "No, thanks, I'll think about it"
          },
          ["AcceptingContracts"] = {
              ["Content"] = "Here are the available contracts:",
              ["Confirm"] = "Accept Contracts",
              ["Cancel"] = "Maybe later"
          },
          ["EndConversation"] = {
              ["Content"] = "Bring back the items I asked for, or take a picture (Breaking or Littering) with your burner phone, then come back for your reward.",
              ["Confirm"] = "Will do, Goodbye"
          }
      },
      
      ["PossibleContracts"] = {
          ["Steal Objects"] = {
              ["Briefcase"] = {
                  ["Label"] = "Snatch the Briefcase",
                  ["Description"] = "Sneak in and grab the briefcase",
                  ["Icon"] = "fas fa-briefcase",
                  ["Model"] = "prop_ld_case_01",
                  ["Animation"] = {Dict = "random@domestic", Anim = "pickup_low"},
                  ["DelayUntilCancelled"] = 1,
                  ["TurnToFaceProp"] = false,
                  ["AnimationProp"] = {
                      ["Model"] = "prop_ld_case_01",
                      ["Bone"] = 57005,
                      ["Offset"] = vector3(0.1, 0.0, -0.03),
                      ["Rotation"] = vector3(-90.0, 0.0, 0.0)
                  },
                  ["Reward"] = {
                      ["Exp"] = 20,
                      ["Type"] = "money",
                      ["Item"] = "",
                      ["Amount"] = {min = 275, max = 300},
                      ["MetaData"] = false
                  }
              },
              ["Harddrive"] = {
                  ["Label"] = "Retrieve the Harddrive",
                  ["Description"] = "Steal the owner's harddrive",
                  ["Icon"] = "fas fa-hard-drive",
                  ["Model"] = "v_res_harddrive",
                  ["Animation"] = {Dict = "anim@heists@ornate_bank@hack", Anim = "hack_loop"},
                  ["DelayUntilCancelled"] = 1,
                  ["TurnToFaceProp"] = false,
                  ["AnimationProp"] = {
                      ["Model"] = "v_res_harddrive",
                      ["Bone"] = 57005,
                      ["Offset"] = vector3(0.1, 0.0, -0.03),
                      ["Rotation"] = vector3(-90.0, 0.0, 0.0)
                  },
                  ["Reward"] = {
                      ["Exp"] = 20,
                      ["Type"] = "money",
                      ["Item"] = "",
                      ["Amount"] = {min = 275, max = 300},
                      ["MetaData"] = false
                  }
              }
          },
          ["Break Objects"] = {
              ["Laptop"] = {
                  ["Label"] = "Smash the Laptop's Screen",
                  ["Description"] = "Teach this overpriced laptop a lesson.",
                  ["Icon"] = "fas fa-laptop",
                  ["Model"] = "prop_laptop_lester",
                  ["BrokenModel"] = "gr_prop_gr_laptop_01c",
                  ["Sound"] = "electronics",
                  ["Animation"] = {
                      ["Breaking"] = {
                          ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                          ["DelayUntilCancelled"] = 1,
                          ["TurnToFaceProp"] = false
                      },
                      ["TakingPicture"] = {
                          ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
                          ["DelayUntilCancelled"] = 4,
                          ["TurnToFaceProp"] = false
                      }
                  },
                  ["Reward"] = {
                      ["Exp"] = 20,
                      ["Type"] = "money",
                      ["Item"] = "",
                      ["Amount"] = {min = 275, max = 300},
                      ["MetaData"] = false
                  }
              },
              ["Phone"] = {
                  ["Label"] = "Smash their Phone",
                  ["Description"] = "Disconnect them from brainrot",
                  ["Icon"] = "fas fa-phone-flip",
                  ["Model"] = "prop_npc_phone",
                  ["BrokenModel"] = "sf_prop_sf_art_phone_01a",
                  ["Sound"] = "electronics",
                  ["Animation"] = {
                      ["Breaking"] = {
                          ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                          ["DelayUntilCancelled"] = 1,
                          ["TurnToFaceProp"] = false
                      },
                      ["TakingPicture"] = {
                          ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
                          ["DelayUntilCancelled"] = 4,
                          ["TurnToFaceProp"] = false
                      }
                  },
                  ["Reward"] = {
                      ["Exp"] = 20,
                      ["Type"] = "money",
                      ["Item"] = "",
                      ["Amount"] = {min = 275, max = 300},
                      ["MetaData"] = false
                  }
              }
          },
          ["Littering"] = {
              ["Cans"] = {
                  ["Label"] = "Scatter cans",
                  ["Description"] = "Scatter cans around like you own the place.",
                  ["Icon"] = "fas fa-trash-can",
                  ["Model"] = "v_ret_247_popcan2",
                  ["LitteredModel"] = "prop_rub_litter_01",
                  ["Sound"] = "trash",
                  ["Animation"] = {
                      ["Pickup"] = {
                          ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                          ["DelayUntilCancelled"] = 1,
                          ["TurnToFaceProp"] = false
                      },
                      ["Litter"] = {
                          ["Animation"] = {Dict = "anim@melee@machete@streamed_core@", Anim = "plyr_walking_attack_a"},
                          ["DelayUntilCancelled"] = 3,
                          ["TurnToFaceProp"] = false
                      },
                      ["TakingPicture"] = {
                          ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
                          ["DelayUntilCancelled"] = 4,
                          ["TurnToFaceProp"] = false
                      }
                  },
                  ["Reward"] = {
                      ["Exp"] = 15,
                      ["Type"] = "money",
                      ["Item"] = "",
                      ["Amount"] = {min = 200, max = 250},
                      ["MetaData"] = false
                  }
              },
              ["Stain"] = {
                  ["Label"] = "Stain the floor",
                  ["Description"] = "Paint the Floor with some spilled drink",
                  ["Icon"] = "fas fa-wine-bottle",
                  ["Model"] = "p_whiskey_bottle_s",
                  ["LitteredModel"] = "p_oil_slick_01",
                  ["Sound"] = "spill",
                  ["Animation"] = {
                      ["Pickup"] = {
                          ["Animation"] = {Dict = "mp_common", Anim = "givetake1_b"},
                          ["DelayUntilCancelled"] = 1,
                          ["TurnToFaceProp"] = false,
                          ["AnimationProp"] = {
                              ["Model"] = "p_whiskey_bottle_s",
                              ["Bone"] = 57005,
                              ["Offset"] = vector3(0.1, 0.0, -0.03),
                              ["Rotation"] = vector3(-90.0, 0.0, 0.0)
                          }
                      },
                      ["Litter"] = {
                          ["Animation"] = {Dict = "anim@amb@clubhouse@tutorial@bkr_tut_ig3@", Anim = "machinic_loop_mechandplayer"},
                          ["DelayUntilCancelled"] = 1,
                          ["TurnToFaceProp"] = false,
                          ["AnimationProp"] = {
                              ["Model"] = "p_whiskey_bottle_s",
                              ["Bone"] = 57005,
                              ["Offset"] = vector3(0.15, 0.1, 0.0),
                              ["Rotation"] = vector3(60.0, 25.0, 180.0)
                          }
                      },
                      ["TakingPicture"] = {
                          ["Scenario"] = "WORLD_HUMAN_STAND_MOBILE",
                          ["DelayUntilCancelled"] = 4,
                          ["TurnToFaceProp"] = false
                      }
                  },
                  ["Reward"] = {
                      ["Exp"] = 15,
                      ["Type"] = "money",
                      ["Item"] = "",
                      ["Amount"] = {min = 200, max = 250},
                      ["MetaData"] = false
                  }
              }
          }
      }
  }
  ```
</Accordion>

***

## Tips for Creating Contracts

### Balance Rewards

* **Steal Objects**: Higher rewards as they require carrying items out
* **Break Objects**: Medium-high rewards requiring breaking and photo proof
* **Littering**: Lower rewards as they're simpler tasks
* Scale rewards based on contract difficulty and time investment

### Choose Appropriate Props

* Check the [GTA V Props Database](https://forge.plebmasters.de/) for prop names
* Use recognizable models that fit the contract theme
* Ensure broken models clearly show damage
* Consider prop size for littering contracts (smaller = more realistic)

### Animation Selection

* Match animations to the action (punching for breaking, bending for picking up)
* Keep `DelayUntilCancelled` values reasonable (1-4 seconds)
* Use scenarios for simple standing animations
* Test animations with different character models

**Using Scenarios Instead**:
For simpler interactions, you can use scenarios instead of animations:

* `"WORLD_HUMAN_STAND_MOBILE"` - Standing with phone
* `"WORLD_HUMAN_BINOCULARS"` - Looking through binoculars
* `"WORLD_HUMAN_GUARD_STAND"` - Standing guard
* `"WORLD_HUMAN_CLIPBOARD"` - Writing on clipboard

Replace `["Animation"] = {Dict = "...", Anim = "..."}` with `["Scenario"] = "SCENARIO_NAME"`

### Sound Effects

* **Glass**: Picture frames, windows, glass items
* **Electronics**: Phones, laptops, tablets, TVs
* **Thud**: Heavy objects, furniture
* **Trash**: Cans, garbage, paper
* **Spill**: Liquids, drinks
* **Poop**: Organic materials (use sparingly)

### Required Items

* Set `"melee"` for break contracts to encourage weapon use
* Require a bag for steal contracts to create more immersion
* Use `"x_burner"` for pictures to integrate with burner phone system
* Set to `false` if you want contracts accessible to everyone

### Dialog Text

* Keep initial dialog friendly and inviting
* Make confirmation buttons clear ("Accept" vs "Decline")
* Provide instructions in the end conversation
* Consider your server's roleplay style and lore
