Hak akses
If you are interested in the permissions that are used in vanilla commands have a look at this page. For customizing the permission levels refer to the server permissions page or your permission plugin's documentation.
Perizinan
Izin adalah kunci string hirarkis case-insensitive yang digunakan untuk menentukan apakah Subjek bisa melakukan tindakan tertentu atau tidak. String dibagi menjadi bagian yang terpisah dengan menggunakan karakter titik. Izin harus terstruktur seperti ini.
<PluginID>.<MainGroup>.<Subgroup1>...
Karakter yang diperbolehkan adalah:
"A" - "Z"
"a" - "z"
"0" - "9"
"_"
"-"
"."
Warisan
Jika seorang pengguna memiliki izin myPlugin.commands
kemudian mereka akan secara otomatis memiliki izin yang lain seperti myPlugin.commands.teleport
kecuali kalau izin secara eksplisit dihapus.
Catatan
Tidak ada sesuatu izin khusus seperti sebuah myPlugin.commands.*
. Gunakan myPlugin.commands
untuk itu.
Struktur-Contoh
Contoh berikut menunjukkan salah satu cara yang mungkin penataan izin, tapi berikut ini struktur tidak diperlukan sama sekali.
myplugin
Hibah penuh akses ke semua izin plugin.
myplugin.commands
Hibah penuh akses ke semua perintah plugin.
myplugin.commands.teleport.execute
Only grants the user the permission to execute the command. Without this permission he is not able to execute the command even if he has other teleport permissions. (With this permission alone, the user would only be able to teleport himself to others in his current world.)
myplugin.commands.teleport.all
Hanya pengguna dengan izin untuk teleport ke seluruh dunia.
myplugin.commands.teleport.all
Hanya pengguna dengan izin untuk teleport ke seluruh dunia.
myplugin.commands.teleport.worlds.mynetherworld
Hanya memberi izin kepada pengguna untuk teleport ke mynetherworld.
IzinDeskripsi
The PermissionDescription adalah utilitas yang dimaksudkan untuk memberi pemilik serverdengan rincian tentang izin tertentu. `` PermissionDescription`` s adalah fitur opsional a PermissionService dapat memberikan. Pembuatan PermissionDescription tidak ** tidak memiliki dampak apakah izin ada, siapa yang memiliki akses atau nilai defaultnya.
Deskripsinya terdiri dari:
id izin target
deskripsi teks
satu atau lebih peran yang ditugaskan
plugin yang memiliki
Jika Anda memiliki elemen dinamis seperti `` World`` atau `` ItemType`` maka Anda dapat menggunakan `` <TemplateParts> ``.
Contoh penggunaan
import org.spongepowered.api.service.permission.PermissionDescription;
import org.spongepowered.api.service.permission.PermissionDescription.Builder;
import org.spongepowered.api.service.permission.PermissionService;
import org.spongepowered.api.text.Text;
PluginContainer plugin = ...;
Builder builder = permissionService.newDescriptionBuilder(plugin);
builder.id("myplugin.commands.teleport.execute")
.description(Text.of("Allows the user to execute the teleport command."))
.assign(PermissionDescription.ROLE_STAFF, true)
.register();
Hasil yang sederhana
myplugin.commands.teleport.execute
Description: Allows the user to execute the teleport command.
Role: user
Owner: MyPlugin v1.2.3
Hasil Template
myplugin.commands.teleport.worlds.<World>
Description: Allows the user to teleport to the world <World>.
Role: staff
Owner: MyPlugin v1.2.3
Tip
Anda bisa melewatkan deskripsi tulisan untuk beberapa izin kelompok orangtua seperti myPlugin.commands.teleport.worlds
atau myPlugin.commands
sebagai makna bahwa bisa diturunkan dari struktur perizinan dan anak-anak yang didefinisikan sendirian.
Perihal
A Subject adalah pemegang izin yang diberikan. Ini bisa didapat dari `` PermissionService`` via SubjectCollections. CommandSources seperti Players adalah `` Subject``s secara default, namun ada banyak jenis `` Subject`` s lainnya. Apa pun yang memiliki izin adalah Subjek meskipun hanya mendelegasikan cek ke Subjek yang tercantum. Izin dapat diberikan atau ditolak ke Subjek. Jika izin tidak diberikan atau ditolak, pengaturannya akan diwariskan. Lihat Warisan. Subjek memberikan metode untuk memeriksa apakah mereka memiliki izin tertentu atau tidak. Plugin yang menggunakan metode ini hanya boleh meminta izin khusus yang ingin mereka periksa. Ini adalah tugas PermissionService untuk menghormati izin dan pewarisan subjek.
Contoh
Contoh berikut dapat digunakan untuk memeriksa apakah Pemain diizinkan untuk menjalankan perintah teleport.
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.world.World;
public boolean canTeleport(Player subject, World targetWorld) {
return subject.hasPermission("myplugin.command.teleport.execute")
&& (subject.getWorld() == targetWorld
|| subject.hasPermission("myplugin.command.teleport." + targetWorld.getName()));
}
Warisan
Jika `` Subjek`` memiliki izin yang diberikan, maka akan menggunakan nilai tersebut. Jika tidak maka akan diwarisi dari parent `` Subject``. Tidak masalah jenis orang tua (misalnya kelompok atau pemain) `` Subjek`` yang mungkin ada.
Jika subjek atau subjek orang tua tidak memberikan atau menolak izin maka ia akan diwarisi dari default `` Subject``s. Setiap `` SubjectCollection`` mendefinisikan default-nya sendiri. Subjek default global dan terlemah dapat diperoleh dari `` PermissionService``. Plugin dapat menentukan hak akses mereka sendiri ke transien default SubjectData selama setiap server dimulainya. Hal ini memungkinkan pemilik server untuk menimpa default yang ditentukan oleh plugin sesuai dengan kebutuhan mereka dengan menggunakan default `` SubjekData` yang tetap. Jika Anda ingin memberikan panduan konfigurasi untuk pemilik server gunakan `` PermissionDescription``'s peran-template sebagai gantinya.
Peringatan
You should think carefully before granting default permissions to users. By granting the permissions you are assuming that all server owners will want these defaults (at least the first time the plugin runs) and that exceptions will require server owners to explicitly deny the permissions (which can't even be done without a custom permissions service implementation). This should roughly correspond to a guest on a single player lan world without cheats. For example, a chat plugin would allow sending chat messages by default to imitate vanilla game behavior for features that were changed by the plugin.
Catatan
Subjek default `` Subjek``s 'persistent `` SubjectData``s diutamakan daripada yang sementara. Untuk semua `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `.
Jika Subjek, maupun orang tuanya, atau bawahannya memberi nilai pada sebuah izin, maka secara otomatis ditolak.
Catatan
Urutan prioritas dalam urutan menurun:
- Bidang subjek
Sementara
Kegigihan
- Subjek Orangtua
Sementara
Kegigihan
- Default SubjekCollection
Kegigihan
Sementara
- PermissionService Defaults
Kegigihan
Sementara
Menolak izin
SubjectCollections
Sebuah wadah untuk subyek yang dapat digunakan untuk mendapatkan Subjek dengan nama. Ini adalah Koleksi Perihal default:
- Pengguna
Berisi semua on-line `` Player``s dan all off-line `` User`` s (setidaknya mereka yang tidak memiliki pengaturan default).
- Kelompok
Berisi semua grup `` Subject``. Grup adalah cara sederhana untuk menyusun sebuah pohon warisan `` Subject`` 's dengan nama `` Subject``s. Grup harus digunakan jika subset khusus
\s Subjek
memiliki pengaturan izin tambahan seperti tim, fraksi, atau peran.
- Sistem
Contains other
Subject
s used by the server such as the console and possible remote consoles.
- Blok Perintah
Berisi semua `` Subject``s untuk blok perintah. Ini berguna jika Anda ingin menjalankan `` CommandBlock`` hanya dengan hak akses pencipta.
- Role Template
Berisi semua subyek template peran yang digunakan di `` PermissionDescription``s. Berguna untuk mencari semua izin yang direkomendasikan bagi pengguna. Ini tidak boleh digunakan untuk warisan.
Catatan
Ketika `` SubjectCollection``s ditanya untuk `` Subjek`` mereka akan secara otomatis dibuat, jika mereka belum ada. Namun mungkin tidak selalu muncul di `` getAllSubjects () `` kecuali jika tidak ada nilai default yang ditetapkan.
SubjectData
SubjectData adalah toko izin sebenarnya yang terhubung ke Subjek. Ada dua jenis toko Subjek:
Sementara = Hanya berlangsung selama sesi berlangsung, tidak pernah disimpan
Biasa (gigih) = Mungkin diselamatkan entah di mana, dan karena itu bertahan dan bertahan selamanya. Yang direkomendasikan untuk `` PermissionService`` s untuk menerapkan toko persisten, namun ini bukan keharusan. Mungkin juga tergantung pada tipe subjek. Jika tidak ada ketekunan maka toko sementara akan dikembalikan pada kedua metode tersebut.
Penulis plugin sebaiknya mempertimbangkan atau perlu mempertahankan harga saat memilih di antara mereka.
Jika hanya untuk waktu yang singkat (misalnya saat minigame) gunakan yang sementara.
Jika sudah lama atau lama (misalnya promosi ke VIP) gunakan yang reguler (persisten).
Silakan merujuk ke bagian Warisan jika ingin mengetahui lebih banyak tentang warisan dan prioritas dari SubjectData`s sementara dan sementara.
Contoh
The following example could be used to give a player a permission with global context and a true value
import org.spongepowered.api.entity.living.player.Player;
public void setPermission(Player player, String permission) {
if(!player.hasPermission(permission)
player.getSubjectData().setPermission(SubjectData.GLOBAL_CONTEXT, permission, Tristate.TRUE);
}
Catatan
In the above example Tristate.TRUE
was used but you can also use Tristate.FALSE
for a false permission and
Tristate.UNDEFINED
to unset the permission entirely.
Pilihan subjek
Subjek juga menyediakan kemungkinan untuk menyimpan opsi string. Ini pada dasarnya adalah pasangan nilai kunci yang dapat ditugaskan dan diwariskan. Tidak seperti string izin, kunci tidak hierarkis dan tidak memberikan mekanisme pewarisan sendiri, tetapi pasangan nilai kunci itu sendiri diwarisi dari orang tua Subject
s dengan cara yang sama dengan izin.
Konteks
Jika Anda mempertimbangkan setiap izin untuk mendapatkan hak istimewa atau kemampuan untuk dapat melakukan sesuatu, a :javadoc:`Konteks` adalah keadaan di mana hak istimewa tersebut dapat digunakan.
Anda mungkin ingin memberi izin ``Subject``untuk melakukan sesuatu, namun hanya jika `` Subjek` berada di dunia tertentu, atau di wilayah tertentu.
Konteks diakumulasikan oleh `` Subjek``, dan kemudian digunakan oleh `` PermissionService`` untuk memutuskan apakah Subject
memiliki hak istimewa atau tidak.
Sponge menyediakan beberapa konteks secara default, namun umumnya turun ke plugin lain untuk memberikan konteks tambahan ke PermissionService, melalui ContextCalculator.
Saat membuat konteks untuk plugin Anda sendiri, cobalah menghindari konflik dengan plugin lain (mis. Dengan awalan tombol konteks dengan id plugin Anda) kecuali konteks ini dimaksudkan untuk dibagikan.
Catatan
Please make sure that your ContextCalculator
responds as fast as possible as it will get called frequently.
Peringatan
ContextCalculator
implementations must be thread safe, because they may be called from outside of the main
thread, or even called in parallel. For to this reason, all non-name or non-uuid based ContextCalculator
s
(such as location-based ones) have to utilize a cache and must be to be updated using event listeners or
synchronized schedulers.
Contoh
`` ContextCalculator` Anda mungkin terlihat seperti ini:
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.service.context.ContextCalculator;
import org.spongepowered.api.service.permission.Subject;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class ExampleCalculator implements ContextCalculator<Subject> {
private static final Context IN_ANY_ARENA = new Context("myarenaplugin-inAnyArena", "true");
private static final Context NOT_ANY_ARENA = new Context("myarenaplugin-inAnyArena", "false");
private static final String ARENA_KEY = "myarenaplugin-arena";
private final Map<UUID, String> playerArenas = new ConcurrentHashMap<>();
@Override
public void accumulateContexts(Subject subject, Set<Context> accumulator) {
CommandSource commandSource = subject.getCommandSource().orElse(null);
if (commandSource instanceof Player) {
UUID uuid = ((Player) commandSource).getUniqueId();
String arena = this.playerArenas.get(uuid);
if (arena != null) {
accumulator.add(IN_ANY_ARENA);
accumulator.add(new Context(ARENA_KEY, arena));
} else {
accumulator.add(NOT_ANY_ARENA);
}
}
}
@Override
public boolean matches(Context context, Subject subject) {
CommandSource commandSource = subject.getCommandSource().orElse(null);
if (commandSource instanceof Player) {
UUID uuid = ((Player) commandSource).getUniqueId();
if (context.equals(IN_ANY_ARENA)) {
return this.playerArenas.containsKey(uuid);
} else if (context.equals(NOT_ANY_ARENA)) {
return !this.playerArenas.containsKey(uuid);
} else if (context.getKey().equals(ARENA_KEY)) {
return context.getValue().equals(this.playerArenas.get(uuid));
}
}
return false;
}
}
`` ContextCalculator`` dapat didaftarkan melalui:
permissionService.registerContextCalculator(contextCalculator);
Untuk Forge Mods
Jika anda ialah penulis modern Menempa dan tidak menggunakan IzinAPI Menempa yang baru namun melakukan memeriksa OP, maka anda telah berada di jalur yang tepat untuk Sponge untuk mengambil izin.
Cara termudah untuk membuat izin Sponge dalam bentuk Forge tanpa lembut - tergantung pada SpongeAPI adalah dengan menggunakan metode yang diberikan oleh kode Vanilla Minecraft di `` ICommandSender``, yaitu `` ICommandSender.canCommandSenderUseCommand (int permLevel, String commandName) ``. String yang dilewatkan ke metode itu sama sekali tidak berguna sama sekali di lingkungan Vanilla Forge, namun saat SpongeForge ditambahkan, secara otomatis String tersebut mengambilnya dan mengubahnya menjadi izin kerja.
Contoh
public class AwesomeBlock extends Block {
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state,
EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
if (player.canUseCommand(4, "examplemod.awesomeblock.interact")) {
// Do cool stuff
return true;
}
return false;
}
}
Seperti yang Anda lihat, kami hanya memeriksa tingkat OP dan lulus dalam String sewenang-wenang yang ingin kami gunakan sebagai izin saat Sponge digunakan. Ketika Forge digunakan dengan sendirinya, pemain hanya memerlukan tingkat OP, sehingga melewatkan nilai 0 akan memungkinkan semua pengguna berinteraksi dengan blok tersebut, namun saat SpongeForge ditambahkan, mereka memerlukan simpul izin `` examplemod.awesomeblock.interact``. Dianjurkan untuk mengikuti struktur izin seperti dijelaskan di atas. Warisan izin juga berlaku untuk pemeriksaan ini.
Catatan
Nama SRG untuk metode ini adalah `` func_70003_b``.