[$10] Ziggurat - Simple Tablist Library [1.7.10-1.13 Server & Client] Supported | No External Depend

Status
This thread has been locked.

Allen Zhang

Not Developer
Banned
Feedback score
18
Posts
16
Reactions
178
Resources
0
Ziggurat - Simple Tablist Library [1.7.10-1.13 Server & Client] Supported | No External Dependency

*I had purchased resell rights from its original creator, @ThatKawaiiSam
He is still selling his own version, Click Here to Go
4UW{325~{)WT56B}ZW[LH}6.png


Introduction
Hi guys! Here is my 1.7.x to 1.13 Tablist Library. It is highly performant and extremely easy to implement and supports custom skins. This fork of Ziggurat doesn't require ProtocolLib and it supports Tablist Header & Footer in 1.7 Spigot with 1.8+ Client Version.

Features
  • Easy to use - The API is simple an intuitive to use for developers of all skill levels.
  • Compatible with all versions - This is the most ground breaking thing about the library, you can use any server version from 1.7.10 all the way up 1.13 as well as any client version from 1.7.10 to 1.13 and the Tablist will function as intended which has not been seen on the market before. This will break new grounds in HCF core version compatibility, Hub core version compatibility, etc.
  • Constantly Updated - The resource will be actively updated with suggestions from the community.
  • Highly configurable - Within each Tablist entry you can adjust the ping, texture and text to suite your own unique aesthetic.
  • No External Dependency - The only limitation of this Ziggurat fork & original one is it must be running on PaperSpigot / TacoSpigot server. You don't need to install ProtocolLib as a necessary dependency. (It will only use ProtocolLib to detect client version if installed as a soft dependency)

Pricing

$10 for Jar with Updates
$20 for Source with Updates

Servers Currently Using (PM me for a server to be added)

API (Example, will post actual API usage when I finished the final Documentation)
Code:
package me.allen.ziggurat.plugin;

import me.allen.ziggurat.Ziggurat;
import me.allen.ziggurat.ZigguratAdapter;
import me.allen.ziggurat.objects.BufferedTabObject;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashSet;
import java.util.Set;

public class ZigguratPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        new Ziggurat(this, new ZigguratAdapter() {
            @Override
            public Set<BufferedTabObject> getSlots(Player player) {
                Set<BufferedTabObject> tabObjects = new HashSet<>();

                int[] ipSlots = new int[] {
                    20, 40, 60
                };

                for (int ipSlot : ipSlots) {
                    tabObjects.add(new BufferedTabObject().text("  &ewww.example.com").slot(ipSlot));
                }

                int[] emptySlots = new int[] {
                    1, 2, 3, 4, 7, 8, 9, 10,
                    11, 12, 13, 14, 15, 16, 17,
                    18, 19, 21, 24, 27, 29, 32,
                    33, 34, 35, 36, 37, 38, 39,
                    41, 42, 43, 44, 47, 48, 49,
                    50, 51, 52, 53, 54, 55, 56,
                    57, 58, 59, 61, 62, 63, 64,
                    65, 66, 72, 73, 74, 75, 76,
                    77, 78, 79, 80
                };

                for (int emptySlot : emptySlots) {
                    tabObjects.add(BufferedTabObject.EMPTY_COLUMN.slot(emptySlot));
                }

                tabObjects.add(new BufferedTabObject()
                        .slot(5)
                        .text("&6Store")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(6)
                        .text("store.example.com")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(22)
                        .text("&6&lExample Network")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(23)
                        .text("&eOnline: &f" + String.format("%,d", 1000) + "/" + String.format("%,d", 10000))
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(25)
                        .text("&6Player Info")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(26)
                        .text("Rank: Member")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(28)
                        .text("&a&lServers")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(30)
                        .text("&eFactions")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(31)
                        .text("&c- WIP")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(45)
                        .text("&6TeamSpeak")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(46)
                        .text("ts.example.com")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(67)
                        .text("&c&lWARNING!!!")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(68)
                        .text("&ePlease use")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(69)
                        .text("&e1.7 for the")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(70)
                        .text("&eoptimal playing")
                );

                tabObjects.add(new BufferedTabObject()
                        .slot(71)
                        .text("&eexperience")
                );

                return tabObjects;
            }

            @Override
            public String getFooter() {
                return "Example Footer";
            }

            @Override
            public String getHeader() {
                return "Example Header";
            }
        });
    }

    @Override
    public void onDisable() {

    }

}

Screenshots
158424

158425


Proof of Ownership
5DMnZXm.png


Todo
More testing
Optimize & Clean The Code
Compatible with any Scorebaord Plugin


Contact
Discord: ThatKawaiiAllen#0817

I have also created a discord server to serve as an easier form of communication for updates and suggestions!
https://www.thatkawaiiallen.me/discord
 

Attachments

  • 4UW{325~{)WT56B}ZW[LH}6.png
    4UW{325~{)WT56B}ZW[LH}6.png
    19 KB · Views: 1,975
Last edited:
PebbleHost
High performance, consistent uptime and fast support. Minecraft hosting that just works.

LilProteinShake

Java/Kotlin Developer
Supreme
Feedback score
9
Posts
326
Reactions
106
Resources
0
Ziggurat - The all in one Tablist Library (Any Server Version & Any Client Version)

*I had purchased resell rights from its original creator, @ThatKawaiiSam
He is still selling his own version, Click Here to Go
View attachment 162695

Introduction
Hi guys! Here is my 1.7.x to 1.13 Tablist Library. It is highly performant and extremely easy to implement. This fork of Ziggurat doesn't require ProtocolLib and it supports Tablist Header & Footer in 1.7 Spigot with 1.8+ Client Version.

Features
  • Easy to use - The API is simple an intuitive to use for developers of all skill levels.
  • Compatible with all versions - This is the most ground breaking thing about the library, you can use any server version from 1.7.10 all the way up 1.13 as well as any client version from 1.7.10 to 1.13 and the Tablist will function as intended which has not been seen on the market before. This will break new grounds in HCF core version compatibility, Hub core version compatibility, etc.
  • Constantly Updated - The resource will be actively updated with suggestions from the community.
  • Highly configurable - Within each Tablist entry you can adjust the ping, texture and text to suite your own unique aesthetic.
  • No External Dependency - The only limitation of this Ziggurat fork is it must be run on PaperSpigot / TacoSpigot server. You don't need to install ProtocolLib as necessary dependency. (It will only use ProtocolLib to detect client version if installed as a soft dependency)

Pricing

$10 for Jar without Updates
$20 for Jar with Updates
$30 for Source without Updates
$40 for Source with Updates

Servers Currently Using (PM me for a server to be added)

API
Will post when I have written up the final documentation

Screenshots
158424

158425


Proof of Ownership
Code:
package me.allen.ziggurat;

import lombok.Getter;
import me.allen.ziggurat.protocollib.ProtocolLibTabImpl;
import me.allen.ziggurat.universal.UniversalTabImpl;
import me.allen.ziggurat.util.IZigguratHelper;
import me.allen.ziggurat.util.PlayerUtil;
import me.allen.ziggurat.util.Reflection;
import lombok.Setter;
import me.allen.ziggurat.util.tinyprotocol.api.ProtocolVersion;
import me.allen.ziggurat.util.version.protocol.*;
import me.allen.ziggurat.v1_7.v1_7TabImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

@Getter
public class Ziggurat {

    //Instance
    @Getter private static Ziggurat instance;

    @Getter
    private static ProtocolCheck protocolCheck;

    private ProtocolVersion version;
    private JavaPlugin plugin;
    private ZigguratAdapter adapter;
    private Map<UUID, ZigguratTablist> tablists;
    private ZigguratThread thread;
    private IZigguratHelper implementation;

    //Tablist Ticks
    @Setter private long ticks = 20;

    public Ziggurat(JavaPlugin plugin, ZigguratAdapter adapter) {
        if (instance != null) {
            throw new RuntimeException("Ziggurat has already been instatiated!");
        }

        if (plugin == null) {
            throw new RuntimeException("Ziggurat can not be instantiated without a plugin instance!");
        }

        instance = this;

        this.plugin = plugin;

        version = ProtocolVersion.getGameVersion();

        Reflection.init();

        PlayerUtil.init();

        this.adapter = adapter;
        this.tablists = new ConcurrentHashMap<>();

        this.registerImplementation();

        this.initProtocolCheck();

        this.setup();
    }

    private void registerImplementation() {
        Bukkit.getConsoleSender().sendMessage("Detected Server Version: " + version.getServerVersion());
        if (version.isBelow(ProtocolVersion.V1_8)) {
            this.implementation = new v1_7TabImpl();
            plugin.getLogger().info("Registered Implementation with 1.7 Protocol");
            return;
        } else if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) {
            this.implementation = new ProtocolLibTabImpl();
            plugin.getLogger().info("Registered Implementation with ProtocolLib Protocol");
            return;
        }

        this.implementation = new UniversalTabImpl();
        plugin.getLogger().info("Registered Implementation with universal Protocol");
    }

    private void setup() {
        //Register Events
        this.plugin.getServer().getPluginManager().registerEvents(new ZigguratListeners(), this.plugin);

        //Ensure that the thread has stopped running
        if (this.thread != null) {
            this.thread.stop();
            this.thread = null;
        }

        //Start Thread
        this.thread = new ZigguratThread(this);
    }

    private void initProtocolCheck() {

        if (Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport")) {
            protocolCheck = new ProtocolSupportProtocolCheck();
            Bukkit.getConsoleSender().sendMessage("Detected ProtocolSupport, now Ziggurat uses API to detect player version!");
            return;
        } else if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) {
            protocolCheck = new ViaVersionProtocolCheck();
            Bukkit.getConsoleSender().sendMessage("Detected ViaVersion, now Ziggurat uses its API to detect player version!");
            return;
        } else if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) {
            protocolCheck = new ProtocolLibProtocolCheck();
            Bukkit.getConsoleSender().sendMessage("Detected ProtocolLib, now Ziggurat uses its API to detect player version!");
            return;
        } else if (version.isBelow(ProtocolVersion.V1_8)) {
            protocolCheck = new ProtocolCheck17();
            Bukkit.getConsoleSender().sendMessage("Detected 1.7 Protocol, now Ziggurat uses its API to detect player version!");
            return;
        }

        protocolCheck = new UniversalProtocolCheck();
        Bukkit.getConsoleSender().sendMessage("Ziggurat uses Universal API to detect player version!");
    }

}


Todo
More testing
Optimize & Clean The Code
Compatible with any Scorebaord Plugin


Contact
Discord: allen_zhang#6666

I have also created a discord server to serve as an easier form of communication for updates and suggestions!
https://discord.gg/UXuAzq9

Just wanted to let you know I think you meant instantiated in the instance not-null check.
 

Allen Zhang

Not Developer
Banned
Feedback score
18
Posts
16
Reactions
178
Resources
0
He means you made a spelling error. Instantiated, not instatiated. "
Ziggurat has already been instatiated"
That’s from its original creator. I will fix this tonight.
 
Banned forever. Reason: Leaking user products

Allen Zhang

Not Developer
Banned
Feedback score
18
Posts
16
Reactions
178
Resources
0
UPDATE:
Optimized Code.
Fixed Entry text in 1.7.10 (ProtocolHack) that counted as scoreboard team suffix (greater than 16 & less than 32) is being colored as Dark Blue.
Added "TabObjectBuilder" to easily create Tab Templates.
 
Banned forever. Reason: Leaking user products

BrianGrug

Full time failure
Supreme
Feedback score
56
Posts
1,473
Reactions
995
Resources
1
Vouch! Great developer
 
Status
This thread has been locked.
Top