FrameProtect - Logo

Item frames, paintings and armor stands are, for simplicity, called objects on this page.

Protect your item frames, paintings and armor stands! Very simple to use.

Your server is not running 1.8 or newer? Info page for older versions of FrameProtect


  • Protect item frames, paintings and armor stands
  • Per player protections
  • Respawn disappeared protected objects
  • Save protected objects from natural destruction (e.g. paintings hanging in air)
  • Save protected objects from destruction by mobs (e.g. creepers, skeletons)
  • Save protected objects from destruction by piston movement
  • MySQL support
  • Permissions support
  • Customizable messages (comes with several predefined languages)
  • Many configuration options


> Make sure that your server is running at least Minecraft 1.8.
> Put FrameProtect.jar into your plugins folder and restart the server.

Update from 2.5 or lower to 2.6

If you're already using FrameProtect, I recommend to use my FrameProtectDatabaseUpdater to update your protections and settings.
This will convert all your data (except the language) to the new format.

It depends on wheter you have set useMySQL to true or not if the updater will convert the MySQL database or the flatfile. It's also possible to convert both, you just have to edit the option in the already updated config.yml and restart the server again.

The update does not delete or overwrite the original data.
> old config.yml gets renamed to config.old
> MySQL data gets copied to new tables
> flatfile data gets copied to a new SQLite database.


  1. Shut down your server.
  2. Remove the old FrameProtect.jar from your plugins folder.
  3. Put FrameProtectDatabaseUpdater.jar into the plugins folder and start the server.
  4. Wait until your server is started. In the console you should find the message [FrameProtectDatabaseUpdater] Update completed!. If you can't find it, something went wrong (the updater will disable itself after finishing, don't be irritated).
  5. Shut down the server.
  6. Remove FrameProtectDatabaseUpdater.jar from your plugins folder.
  7. Put the new FrameProtect.jar into your plugins folder and start the server.
  8. Done!

How It Works

Protect & Unprotect

Protect or unprotect an object.

Simply shift left click it.
The permission frameProtect.protect is needed.
Notice: is still needed if you want your players to be able to place objects.

Protected objects will be saved to the database. No other players (except admins) will be able to destroy them or steal your items. If, caused by any issue, some objects disappear unexpected, FrameProtect will, in most cases, be able to respawn them.


Autoprotection will protect each object that you place.

Notice: Armor stand autoprotection doesn't work at the moment.

Place an object.
The permission frameProtect.autoprotect is needed.
Without giving your players frameProtect.protect, autoprotection will still work and they will never be able to unprotect their objects.

It may be helpful if you don't want to teach all your new players in protecting objects.
Also, without the frameProtect.protect permission, you will hardly ever have problems with players fighting for an object.

Object Info

Get the coordinates and the owner of an object.

Simply shift right click it.
The permission is needed.

I don't know :C

Set Owner

Change the owner of an object.

Type /fp owner <name> into the chat and then shift click an object.
The permission frameProtect.admin is needed.

Maybe it will be useful for you at an undefined point of the history of your server.

Admin Stuff

Remove protections of other people
Take items from protected objects
Reload the plugin (config.yml, protections and language)

Reload: /fp reload
The permission frameProtect.admin is needed.

Because admins should be able to administer.


PermissionFunction*place & destroy objects
frameProtect.protect.*protect & unprotect*object info
frameProtect.adminset owner
frameProtect.adminadmin stuff

Instead of .*, which means it's for all objects, you can put .itemframe, .painting or .armorstand

For example:
You want to allow your players to protect paintings but not item frames and armor stands.
The permission you have to give to this group would be: frameProtect.protect.painting


You can find all configuration options including description and default value in the config.yml file.


  • Get the new version to work with 1.7.10.
  • Make FrameProtect able to recognize worlds when they were renamed.
  • Make the set owner function work for normal players to transfer their protections to others.
  • Any requests?


FrameProtect supports custom languages.

The plugin contains several language files:

en_USEnglishEnglishby Dragon252525
de_DEGermanDeutschby Dragon252525
fr_FRFrenchfrançaisby Dragon252525
eu_ESBasqueEuskaraby galaipa
cs_CZCzechčeštinaby Shadowhacker

Translations that you can download additionally (not yet coming with the plugin):

ru_RURussianрусскийby Aqelius

Creating a new language file

Download example: en_US

%s, %1$s, %2$s and %3$s are placeholders. Please do not remove them.

If your language needs seperate messages for the different objects:

  destroyed: "Privater %s zerstört."
  destroyed_painting: "Privates %s zerstört."

This supports _itemframe, _painting and _armorstand.
If there are only two different messages, you can add the suffix to the one that's only needed once and leave the other like it is.

Sometimes you will see some strange symbols ingame, this is caused by a wrong file encoding, which you can change with most text editors.

If you want to share your work, I would be very happy if you send me a PM and post your translation on pastebin or somewhere else ;)

Known Bugs

  • AutoProtection doesn't work for armor stands.
  • The updater does sometimes not convert all/any protections.
  • Respawning doesn't work always.


FrameProtect sends statistics about the usage to You can disable this by setting the option opt-out in the YourServerFolder/plugins/PluginMetrics/config.yml file to true.
FrameProtect - MCStats

You must login to post a comment. Don't have an account? Register to get one!

  • Avatar of Dragon252525 Dragon252525 Jan 29, 2015 at 16:02 UTC - 0 likes

    @Formula350: Go

    I think the processing time depends on the amount of entities (till v2.5, newer versions will have problems with the amount of protections). 20 players might not cause >that< much events.

    The BlockExpEvent seems to be shown because BlockBreakEvent, which FrameProtect listens to, is a subclass of it.

    But thanks anyways ;)

    Last edited Jan 29, 2015 by Dragon252525


  • Avatar of Formula350 Formula350 Jan 25, 2015 at 21:13 UTC - 0 likes

    @Dragon252525: Go

    I don't know if this helps or not, but since my server generally has 20-30 people on it (not exactly "a lot" by any means), and we have a huge map (8gb just for world), I figured may as well see how much of a "hog" FrameProtect actually is... and compared to the majority of plugins I have (66 total) it certainly does not eat up that much processing time...
    (Sorry for the length, [spoiler] doesn't seem to work and I don't know any replacement in Bukkit's comments)

    /memory details:

    Users: 20
    Uptime: 1d 5hr
    TPS: 20.04
    Max-mem: 14,281MB
    Allocated: 7,248MB
    Free-mem: 1,473MB
    World: 2,863 chunks, 1,943 entites, 2,009 tiles
    Nether: 292 chunks, 104 entites, 51 tiles
    World2:  289 chunks, 1 entity, 33 tiles
    Flatland: 289 chunks, 32 entites, 24 tiles
    (End and Mount Olympus worlds are zero since no players there)

    Timings for FrameProtect (mine lists BlockExpEvent as well BTW, but I think that's a result of Merged timing report? Maybe not, I'm really ignorant on these reports for the most part lol):

    FrameProtect v2.5
        EntityDamageEvent: (and sub-classes) Time: 104004636 Count: 761940 Avg: 136
        PlayerInteractEntityEvent: Time: 48327601 Count: 19754 Avg: 2446
        BlockPlaceEvent: (and sub-classes) Time: 104508649 Count: 66823 Avg: 1563
        BlockExpEvent: (and sub-classes) Time: 49329514761 Count: 131403 Avg: 375406
        BlockPistonExtendEvent: Time: 1758951447 Count: 4372 Avg: 402321
        HangingBreakEvent: (and sub-classes) Time: 80190683 Count: 112095 Avg: 715
        HangingBreakEvent: (and sub-classes) Time: 14769004 Count: 112095 Avg: 131
        HangingPlaceEvent: Time: 163601856 Count: 86 Avg: 1902347
      Total time 51603868637 (51s)

    For comparison, a plugin that has comparatively little usage or player interaction on my server outside of the new player spawn (accounting for 4 portals) and one from Olympus to the Underworld (3 portals, the one I formed at a 90 deg angle):

    Multiverse-Portals v2.5-b713
        PluginEnableEvent: Time: 327201 Count: 16 Avg: 20450
        PlayerMoveEvent: Time: 88601231557 Count: 10020107 Avg: 8842
        PlayerTeleportEvent: Time: 347644458 Count: 126312 Avg: 2752
        PlayerInteractEvent: Time: 1873272944 Count: 445909 Avg: 4201
        PlayerPortalEvent: Time: 2659215 Count: 100 Avg: 26592
        BlockPhysicsEvent: Time: 1789366453 Count: 13366173 Avg: 133
        BlockFromToEvent: Time: 3619251853 Count: 1083608 Avg: 3340
        VehicleMoveEvent: Time: 2715525685 Count: 812444 Avg: 3342
        PlayerBucketFillEvent: Time: 12534668 Count: 235 Avg: 53339
        PlayerBucketEmptyEvent: Time: 11132871 Count: 197 Avg: 56512
      Total time 98972946905 (98s)
  • Avatar of Dragon252525 Dragon252525 Jan 25, 2015 at 18:18 UTC - 1 like

    @Iwitrag: Go

    WorldGuard only protects item frames per WorldGuard regions while FrameProtect generates protected areas for each protected object (if enabled). This is much more expensive than just checking if the object is inside a huge region :/

    What I'm most worried about is the new backup function -> for example for armor stands, all items and poses belonging to them are cloned to the RAM. I'll have to do something about that very soon.

  • Avatar of Iwitrag Iwitrag Jan 25, 2015 at 12:38 UTC - 0 likes

    @Dragon252525: Go

    WorldGuard can protect item-frames too - why don't you just look at their code and learn? :)

  • Avatar of Dragon252525 Dragon252525 Jan 25, 2015 at 11:17 UTC - 0 likes

    @chistian95: Go

    The plugin is done so far. I'm now testing it and writing the Updater for older versions. It will hopefully be released this week.

    @Iwitrag: Go

    I know that it takes lot of resources :/ But FrameProtect doesn't even capture the BlockExpEvent O_o

    I'm trying to make it run smoother but I can't realy test it out since I've no big server to try it out on. Some options like piston protection and block protection will be very expensive to calculate when you have many many protections around so I added some config options to turn those functions off. Sadly it has to load all protections to the RAM and I don't realy know else I could do this... Now when I added a backup functon it will use even more RAM (much more I guess). I've to find a solution for this.

  • Avatar of Iwitrag Iwitrag Jan 23, 2015 at 19:38 UTC - 0 likes

    This plugin takes a lot of resources. We have 74 plugins and FrameProtect 2.5 takes 35% of all computing time. BlockExpEvent is the problem.

    Last edited Jan 24, 2015 by Iwitrag
  • Avatar of chistian95 chistian95 Jan 22, 2015 at 10:26 UTC - 0 likes

    Any release date?

  • Avatar of Dragon252525 Dragon252525 Jan 10, 2015 at 13:58 UTC - 0 likes

    @syberia97: Go

    Could you please be more specific? Do you get any errors?

  • Avatar of syberia97 syberia97 Jan 10, 2015 at 12:51 UTC - 0 likes

    not working 1.8 ....

  • Avatar of Dragon252525 Dragon252525 Jan 08, 2015 at 18:39 UTC - 0 likes

    @miki88mouse: Go

    This doesn't belong to the main task of the plugin :/ But it's very simple to do so it wouldn't take too long to write an extra plugin for this. (PM me)

    @live4redline: Go

    Actually I'm about to make it even simpler :) Protecting/deprotecting will be done by simply shift clicking an object.

    It might take a while untill I release the new version because it's a complete recode and stores data in a different way, what causes me to, when it's finally working without problems, I'll have to write a conversion tool for your database (I think you don't want to loose all your protections c:)

    @syberia97: Go

    There's no official polish translation at the moment :/ maybe one of the other plugins users here have translated it and can send you their language file, else you have to do it at your own.

    Last edited Jan 08, 2015 by Dragon252525


Date created
Nov 04, 2012
Last update
Feb 05, 2015
Development stage
  • deDE
  • enUS
  • frFR
All Rights Reserved
Curse link
Recent files