Leaderboard
-
AndrewPH
Administrator856Points526Posts -
Goodly
Moderator653Points603Posts -
KawaiiCube
Glodden Godd369Points178Posts -
MESYETI
Glod Menbie354Points336Posts
Popular Content
Showing content with the highest reputation since 04/08/20 in all areas
-
rate my classicube house
24 points24 points
-
stop making freebuild servers
14 pointsthere are already 50 other freebuild servers, when a new server starts it gets 10 players then dies in a few days i miss ephermia anarchy14 points
-
Forums updated to the latest jazz
14 pointsHey y'all, I've updated the forums to the latest version of the forum software, and have migrated it to a much more modular deployment system. The forums should be much more performant now, and capable of handling the immense traffic this game demands of it. Enjoy!14 points
-
Tutorial Guidelines
13 pointsThese are some super important guidelines to follow when making your dirt house tutorial. If your thread is found to be of low enough quality, it will be expunged with extreme prejudice. Perhaps you'll even get a temporary ban, to sate our thirst for bans. Jk we won't ban you (probably). Title Guidelines Your thread's title must describe what the tutorial is about and be about the length of a short sentence. As an example: How to make a dirt house in 3 easy steps! Once you've got the title out of the way, you must make sure to set the tags. It's not super important that you add more than one, but that one is a doozy. It must categorize what the tutorial is for. As an example, if your tutorial pertains to a particular server software, add that server software name to your tags and then set it as your Item prefix. Here's an example: Tutorial Guidelines Make sure your tutorial ticks the following boxes: Has clear, easy-to-follow steps. Descriptive descriptions. Images for clarification A point (no, "how to get OP on my server" is not a good tutorial) Good luck making tutorials!13 points
-
Important update released for MCGalaxy
11 pointsHey all! Update 1.9.4.4 for MCGalaxy has been released, adding support for remote web socket proxies. It's highly recommended that you update your server, or backport the changes if you run a custom copy, so that IP address information is accurate when we switch on the proxy for web client users. This change allows folks using the web client to continue to play the game online as browsers implement more strict security measures. You can download the latest release from Github: https://github.com/UnknownShadow200/MCGalaxy/releases/tag/1.9.4.4 If you're developing your own software that has web client support and you have questions, hop onto our Discord server to learn more: https://www.classicube.net/discord11 points
-
classicube with shaders!
10 pointsclassicube with shaders! ever wanted to make classicube look spectacular with shaders? well,i am proud to tell you that you can do that indeed,you just need to follow my easy guide on how to get those! if your running on windows and you are intrested in this go visit the installation guide at:https://github.com/williamlegotyler/classicube-shaders-EXTENDED10 points
-
Knight Rider kitt replica
10 pointshey guys! its me,Android_c10! coming up with a MASSIVE build today! basically,about 7 months ago i started working on a kitt replica from the "knight rider" tv serie that was produced in 1982,i am a BIG fan of that serie! so basically i started making it on a server that now,unfortunately is down,the owner of that server was my friend,it was a pretty amazing server to me,lasted about 9 months, and i was superadmin on there,so then,i was continously doing work on it,until the last month of life of that server,wich was mostly down,then,2 months later i contacted the owner of the server wich told me he left classicube and asked him if he could give me the server's code,so here i am,continuing work on my kitt replica! here it is: Note that the replica your seeing is still not finished,theres still a lot of work to be done,but,even if its not finished i'd say it looks pretty nice. If you dont know what the knight rider serie is go check this out:https://www.youtube.com/watch?v=nBOh9HH1ocs oh and also i made this replica all alone,no help from anyone else. Hope you like it!10 points
-
ClassiCube now found on Itch.io!
10 pointsHello all, Have you ever wanted to help support ClassiCube in some way other than our Patreon and purchasing ClassiCube on Steam? Well, good news! ClassiCube is now available on Itch.io! ClassiCube by AndrewPH Pay what you want (including $0.00) to add ClassiCube to your itch.io library! This release marks the first time that the Steam sound assets are ever included with the game for free! Along with this release, I have updated the beta branch of ClassiCube on Steam to the latest version, to be pushed to the general public Soon(tm). Thank you for flying ClassiCube, Andrew10 points
-
i support trans rights
9 points
-
Forums updated to the latest jazz
9 points
-
New avatars on the forum
9 pointsHey all, Some of you may have noticed that I've changed the avatars on the forum from a front-facing preview of your skin into a 3d isometric view of your skin's head. I rewrote the face renderer to look more visually appealing. Let me know if it's incorrectly rendering your skin (and give an example of how it should be rendered) Enjoy! For developers: You can get these images easily by going to https://www.classicube.net/face/USERNAME/ (replace USERNAME with a username) This path will always return an image, so you can use it even when you're not sure if the user exists or has a skin, without needing any error handling.9 points
-
New avatars on the forum
9 points
-
Introducing ClassiCube SkinSwatch
9 pointsHave you ever wanted to make your own wacky skin, but aren't a skilled pixel artist? Have you ever wanted to combine the helmet layer of one skin with the rest of another skin? Have you ever just wanted to randomly combine a bunch of skin layers together to make your own abomination entirely? Well, yearn no more. With ClassiCube SkinSwatch you can easily create a new skin out of dozens of premade skins. Once you're done customizing your skin, hit the ClassiCube logo in the top right of the editor to set your ClassiCube skin, or hit the floppy disk icon to save the skin locally. You can still upload skins to the website the old-fashioned way, by navigating to the account panel and uploading a skin file. If you want me to add more base skins to the editor, or are having problems using the editor, post a comment on this thread. Enjoy!9 points
-
ClassiCube Launcher Gadget
8 pointsI made a gadget for Windows 7 / Vista (or higher with GadgetPack) that can launch ClassiCube. Download | Source8 points
-
I'm gonna get banned!!!!!!!
8 points
-
(OUTDATED) How to set up authentication for players on BetaCraft
OUTDATED! BetaCraft V1 heartbeat has been nonfunctional for a long while and will be sunset on October 1st 2024. You can view the new instructions for setting up the heartbeat here. You however still have to configure the auth service for ClassiCube to avoid username conflicts. This tutorial shows you how to set up a server running MCGalaxy 1.9.3.5+ to allow players to connect from BetaCraft, or other services. Step 1. Open up server.properties inside the properties folder, and under "Other settings" you should find a variable called "HeartbeatURL". Step 2. Change HeartbeatURL to http://www.classicube.net/heartbeat.jsp,https://betacraft.uk/heartbeat.jsp After doing that, the following area should look like this. Step 3. Save the file, and do /server reload to generate the necessary configuration. Step 4 (MCGalaxy 1.9.3.6+). Open up authservices.properties inside the properties folder, and look for a line that says URL = http://www.classicube.net/heartbeat.jsp Under it change name-suffix = to name-suffix = + And under URL = https://betacraft.uk/heartbeat.jsp change skin-prefix = to skin-prefix = https://minotar.net/skin/ (MCGalaxy 1.9.4.8+) along side changing mojang-auth = false to mojang-auth = true The file should now look like this. Doing these changes allows the server to know and properly store player info for each player on each authentication service, and allows ClassiCube players to see Minecraft player skins. Step 5. Save the file and do /server reload, and wait for a while. Step 6. Check both of the server lists if your server is listed. Step 7. Join the server using the same username on both BetaCraft and ClassiCube to see if everything works.8 points
-
If you could have ClassiCube ported to any one platform, what would it be?
8 points
-
A Halloween special - early alpha version for Android
A port of ClassiCube for Android is now available - with some limitations however: It's only available as an .apk download (Not available in the Google Play Store) The .apk was compiled in debug mode, so it will be slower than normal It's early alpha. It will very likely crash, freeze, perform poorly, etc. Please report these to me so I can work on fixing them. (Also note that the in-game UI of the Android version is almost exactly the same as the UI when you use the web client on android)8 points
-
2-Factor Authentication and you
8 pointsHello! You may have noticed that you're now being asked for a "Login Code" when you log in from a new location (or new connection), and you might be wondering what that is and why it's happening. This is called 2-factor authentication, and what that means is it requires that you prove who you are by not only using your password, but also by providing a unique random code sent to a secure location that only you should have access to. In this case, your email. That prevents somebody from logging into your account, even if they know your account password, as long as your email and email password are secured. Why am I being forced to use it?? I don't want this, my account won't ever get hacked!! This is being enabled site-wide with no option to turn it off at this time. This probably will change in the future, but I don't have a solid timeframe yet. It's been forced on because there was recently an attempted hack that exposed the fact that over 1% of the playerbase used their username as their password. Evidently the playerbase can't be trusted to use secure passwords, judging by that statistic. Anyway, hopefully this doesn't cause too much of a ruckus with any of you. If you get locked out of your account, visit us on Discord and we'll look into the issue.8 points
-
Hax, Cheating, Proxies & Bots, in General.
NEVER POST ANYTHING LIKE THIS IN THIS THREAD, EVER Inane single-world replies like "cool" or "wow how did you code that" — That's what reactions are for, use them! Don't ask for tech-support with learning the C Programming Language Mope about how burnt out you are and how you have this great idea but not sure if anyone would like it — Just make things already! Do not boast about griefing, cyber-crime, infiltrating people's accounts and expect praise — We are programmers, not mouth-breathing skiddies Don't post about how you disabled HacksControl, or +hax MOTD toggles — Everyone already knows how to do this, it's a one-line change What's the point of this thread?There's a small group of ClassiCube players who "play" the game by making modified clients, bots, man-in-the-middle proxies and in general: client-side hax. Not just using off-the-shelf cheat clients, but actually writing our own that do cool and unique things. Most of the time, we clump together in a random server for a few hours and show off our recent work, but sometimes we miss something awesome. This thread is for boasting about cool cheats that you have made, sharing source code, tips, tricks, and just yapping about cheats in general. Keep the signal-to-noise ratio high, and be polite and thoughtful. Cool things people already made@Rainb0wSkeppy's bot playing Bad Apple by rapidly placing blocks (not a server-side plugin; this video is speed up about 15% to sync with the original video, filmed on Ephemera Anarchy) https://files.catbox.moe/kccj27.mp4 @jshtab's copy+paste feature in their modified client https://files.catbox.moe/ehehwc.webm Wall of Dangerous and Potentially Interested Programmers@SuperZPMax @morgana @Icee_ @AAA59 @Alland20201 @FavoritoHJS @HarmonyNetwork7 points
-
Survival Server Source Code
7 pointsHello! Here's the source code to my bad survival server if anyone wants it! (Always has been open source) I would recommend not trusting the compiled DLLs and compiling all plugins yourself, and finding the Inf-ID version of Mcgalaxy yourself https://github.com/morgana-x/mc-galaxy-server-backup Has + Working Doors + Tools + Beds that can be used as savepoints + Eatable Cakes + Naturally spawning Mobs (Modified MobAI by Venk) + Mining animations + Torches + Crafting + Mining + Held blocks + Daynight cycle (Modified Daynightcycle by Venk) I'm pretty much done with Classicube now and it will no longer have much major development from me at-least Thanks to Venk for original Survival plugin (Was rewritten though pretty much by me at this point), as well as MobAI, DaynightCycle, and Holdblock plugin, very much the goat7 points
-
Some Random Polls
7 points
-
Setting up a server in Linux
7 pointssudo apt update sudo apt install mono-complete unzip mkdir MCGalaxy cd MCGalaxy wget https://github.com/ClassiCube/MCGalaxy/releases/download/1.9.4.9/mcgalaxy_1.9.4.9.zip unzip mcgalaxy_1.9.4.9.zip screen -S server (optionally) mono MCGalaxyCLI.exe7 points
-
If you could have ClassiCube ported to any one platform, what would it be?
TI-84 Plus Graphing Calculator.7 points
-
New avatars on the forum
7 pointsYou can use ClassiCube SkinSwatch or you can use most (if not all) Minecraft-compatible skins.7 points
-
New avatars on the forum
7 points
-
New avatars on the forum
7 pointsI quite enjoy my head being decapitated for the sole purpose of display on a forums. Thank you, Andrew "PH".7 points
-
classicube with shaders!
6 points
-
my first working custom cmd
6 pointsSource code posted via the release section of GitHub, instead of the actual git repository, as god intended.6 points
-
stop making freebuild servers
6 pointsTrue, but the people who need to hear that either aren’t going to read this or can’t read.6 points
-
Some Random Polls
6 pointsActually hating on people for their sexuality in general is wrong. Straightphobia isn't a thing and you're just using that as an excuse to continue such bigoted behavior. Show me examples where widespread exclusion and suppression of straight people are being exhibited and maybe I will listen to what you have to say.6 points
-
Some Random Polls
6 pointsIt’s not that deep, it’s a free 3D Voxel Sandbox game for everyone to enjoy. It’s up to the server to create a welcoming and fun experience for the player. Maybe you should take a step back and look at your own behavior if you’re getting banned from all of these servers. Not everything is the fault of others.6 points
-
What are your computer specs?
6 pointsmy computer specs: cpu:intel 4004, 740 khz, 4 bits. ram:256 kb (idk the manufacturer) motherboard:aSUS isa-386C case:pegaSUS inc. model P700 power supply:electroBOOM disk:16 mb 100 kb/s os:ms SUS(because i can't afford the real ms dos) keyboard:Northgate OmniKey/101 mouse:Logictech M500 monitor:NEC MultiSync 2A speakers:(none) also,ik the cpu is too old to be compatible with my motherboard,but i just did some very simple and clean cable connections from my 4004 to the socket of my motherboard to make it actually work somewhat properly. here it is if you wanna see it:6 points
-
Art Sharing
6 points6 points
-
brainrot youtube comments
6 pointsHello, user! I've got some bad news. Actually, there is no game- wait, wrong script. Uhhhhh- you've come here to be instantly exiled from both society or a social platform. Well, you're in the wrong place. Now leave. Actually, don't leave. Below will be a list of brainrot youtube comments that you should also use when making your own comment. Because we all hate originality, right? All you need are some strings of text, no originality, heh. 1. "___" got me dying / rolling on the floor / is crazy 💀 2. Can we just appreciate how ___ 3. I'll ___ for every like 4. The ___ caught me off guard 💀 5. 0 views in ___ seconds, bro fell off 6. Bro called us ___ in ___ languages 💀 7. The thumbnail 💀 8. You know it's a good day when ___ uploads 9. If I get ___ likes I'll ___ 10. Edit: thanks for the likes 11. The ending is insane 💀 12. We got ___ before GTA 6 13. Plot twist: ___ 14. I think we owe ___ an apology 15. Anyone here in ____? 16. I liked my own comment 17. Tell a long story no one will read 18. Basically glazing the creator that made the video in the first place 19. Say something already said multiple times (usually a bot would comment this, but you can also do it too? I guess) 20. FIRST 21. Something original (actually, don't use this one. you wouldn't need it) 22. Repeats something that had already been said in the video and adds "💀" 23. Only ___ can like this comment 👇 24. If you like ___ 👇 / If you hate ___ 👇 25. Don't translate: вас прокляли и вы умрете через 24 часа. Опубликуйте этот комментарий к 5 другим видео, чтобы снять проклятие. (you have been cursed and will now die in 24 hours post this comment on 5 other videos to uncurse yourself) with a mrbeast profile picture 26. Don't read my profile picture 27. Video of ___ doing __: *link* with a mrbeast profile picture 28. Underrated comment 29. No comments, let me fix that 30. I watched a video of dog getting put down and I laughed because my content is better you should subscribe to me instead (wtf) with a mrbeast profile picture6 points
-
So..I've been trying to install classicube on my sisters laptop and i got thid warning.Is it safe?
6 pointsThat warning is probably Windows SmartScreen, which is (in my opinion) completely useless. It basically means "warning, this app's dev didn't sign the executable with an expensive certificate". So yes, it should be safe to run.6 points
-
Important update released for MCGalaxy
6 points
-
New avatars on the forum
6 pointsI really like this new feature, I always hated the whole close up pixel face thingy like this god that makes me cringe 😐 anyways good work Andrew I like this waaay better6 points
-
New avatars on the forum
6 points
-
Merry Christmas and Happy Holidays!
6 pointsHappy holidays from the ClassiCube Team! I hope everybody had a warm, safe Christmas. Share with the class- what did you get for Christmas that you were excited about? Don't celebrate Christmas? Tell us about your traditions.6 points
-
A Giving of Thanks
6 points
-
What is this? Where am I? Where did all the topics go?!
what you should add would be a way to navigate your way back to the classicube site. Kinda gets annoying having to press back to get back to the classicube site.6 points
-
What is this? Where am I? Where did all the topics go?!
if you only knew what goes into making software like this, the only thing "special" about them would be the rate they decrease your will to live6 points
-
Desert Bus Source Code
5 pointsSource Code for the Desert Bus server, inspired by the hit minigame Desert Bus (1995) GitHubGitHub - morgana-x/DesertCubeContribute to morgana-x/DesertCube development by creating an account on GitHub.5 points
-
Isometric Screenshots?
5 pointsif the map has fly enabled, you can go into third person, scroll the mouse wheel down to zoom out until the camera is as far away as you want5 points
-
How to create MCGalaxy plugins, 2025 Edition
[transmission started] You might want to create a server, and you've also read some tutorials involving the server creation guide, and how to get new players, but what you realize as a major part is, you need custom content. This custom content would mean some unique game mode, or some cool maps that distinct yourself from being a regular free build server. This is where plugins come in. What are plugins? Plugins are custom code written by you or someone else, and when loaded, will execute code to modify the server's behavior (which can include, but is not limited to, triggering additional actions upon events being called, registering a new command, registering a new TopStat (/top), modifying what the TabList looks like, etc). How are they made? Plugins are .dll files (dynamic-link libraries), aka program extensions that are compiled from source files, which in other words are human-readable text/code. Generally, these source files are written in C#, but there is also options for writing these plugins in other .NET programming languages. The DLL file is produced by a compiler, which could be the built-in server compiler on MCGalaxy (using the /Compile command), your IDE (the code editor), or the dotnet command line tools. In this tutorial, we will be looking at using the server and using Visual Studio 2019 to compile code. NOTE: MCGalaxy is targeted at .NET framework 4.0, which is an older .NET framework. Meaning, you cannot use newer syntaxes/features unless you re-target MCGalaxy and self-compile the server software, which is strongly not recommended. If you have Visual Studio 2019 Community or Professional installed on your personal computer, and given that you are hosting the server on your personal computer, the server will look and use the compiler from Visual Studio, however. Now with the two major questions answered, let's get to the process. Setting up your workspace.Before we start talking about the code structure of how plugins are written, let's get the software required set up. IDEs (Integrated development environment) are software used to write your code on, you can say they are a more advanced text editor, given we are really just editing plain text files that have a fancy file extension (in this case, the file extension is .cs). The following software are what I recommend for using to write your code on. 1) Visual Studio 2019 (Windows users only) 2) SharpDevelop (Windows users only) 3) MonoDevelop (Linux users only) 4) Visual Studio Code (Cross platform, there's also a web version but it has limited functionalities) In this tutorial, we will only be using Visual Studio 2019, so unfortunately if you would like to use the other software, you will need to ask someone else for assistance to that software. How to install Visual Studio 2019: Unfortunately, Microsoft is a poop head who decided to remove the installation packages for Visual Studio 2019 from their website. So, you will need to source the installer from somewhere else. Chocolatey happens to have sourced the installer to VS 2019, which you can find from this link: https://community.chocolatey.org/packages?q=visual%20studio%202019 You can choose any edition of Visual Studio, because there are already keys online that can be repeatedly used to give you access to any edition. (It's not like Microsoft is trying to make money off the older edition anyways, why do you think they removed it from their website?). I found the keys https://gist.github.com/ansarizafar/7234695e0837c92283144699c3f27532 Chocolatey is a package manager, which is simply software that manages the installations of other software. However, the process to install it is slightly confusing. For our case, we are not setting this up as an organization, and it is assumed that you're using Windows. So, you can open the installation page for Choloatey https://chocolatey.org/install and then select the Individual option. Then, you will open Windows Powershell in Administrator mode, copy and paste the line of code from the website (where it says Set-Execution-Policy) into Powershell, and press enter. Once Chocolatey installs, navigate back to the Chocolatey package search web page, and copy the command to the edition of Visual Studio you would like to install, and paste that into Windows Powershell, and press enter. After this finishes, you're all good to go! Installing Git Version Control / GitHub Desktop (optional) Version control is used to synchronize the copy of the code from your computer to a remote server. This allows for you and other people to collaborate together. The popular options for the remote servers are GitHub and GitLabs. You can use your IDE's built in Git features, the git command line tools, or GitHub Desktop to synchronize your code. Both the IDE Git features and GitHub Desktop features are very self explanatory and easy to navigate through, so I will save time on explaining that part. 1) We will be creating an account on either GitLab or GitHub first. 2) Once you've verified your email, we are now going to create a repository, which is basically our project. 2a) You might want to make this repository private so no one else besides you and your invited members see the code. 3) Change your working directory to the folder you want to set up your project in (cd [directory]), then use git clone [url] to set up the repository. 3a) You might be asked to authenticate yourself. If you are using GitHub, you can put in your username, but then for the password, you will need to paste in your GitHub API Token, which you can get here: https://github.com/settings/tokens. You should select repo and read:org. Make sure you SAVE THIS TOKEN TO SOMEWHERE SAFE, PREFERABLY YOUR PASSWORD MANAGER. This can allow dangerous people to access your repositories, which is not good. 3b) If you are using GitHub, it is recommended you also install this software, as it will save your time from having to paste in your token each time: https://cli.github.com/. When this is installed, all you need to do is to follow steps 1-2, but you will need to type gh auth login and then type gh repo clone. Read https://cli.github.com/manual/ for how GitHub CLI works. 4) voila! Your repository is set up. Just a few important commands to remember: 1) git add . - Adds all your changed files 2) git commit -m "your message here" - Creates a commit with "your message here" being the summary of what you've changed. You can think of commits as 3) git push - Sends your commits to the server. You will run these three commands in order each time you would like to make a change to the Git repository. PLEASE NOTE ABOUT MERGE CONFLICTS! If someone else updated the code, you will need to make sure their changes do not conflict with what you're syncing to the remote. Read https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line for more info. Creating your solution, and the CSharp project (.csproj) If you are using MonoDevelop/SharpDevelop/Visual Studio 2019, you will see an option for creating a new project/solution. You will need to click on that, and then give a name to your project, and click "Create". Then, you'll need to download the MCGalaxy_.dll file, and reference it. In Visual Studio 2019, you can reference the file by expanding the project, right click References, and click "Add Reference". Then, you'll select the location to the DLL file. What we are doing here is adding MCGalaxy's main code as a package. This will allow for the IDE to help you with auto-filling methods, and giving hints to the method parameters related to specific parts of the software. It will also allow you to compile the software. Writing the codeIf you do not know how to write code, or if you know how to write code but this is your first time touching C#, that's fine. Please take a look at the below resources available to you: https://www.w3schools.com/cs/index.php https://www.codecademy.com/learn/learn-c-sharp https://essentialcsharp.com/ The fundamental concepts covered in the two websites are very important to what we will be doing. Starting off with a plugin We will be creating an example plugin called "NotifyPlayer", which will alert players if our mascot, John ClassiCube has problem with the player because that player has "cubed" too much. Below is the file "NotifyPlayer.cs": In the above screenshot, we have done the following: 1) Defined our namespace, JohnClassiCubeLand. Namespaces often times help organize our code, and say if we have a large program/plugin we are making, then the namespace generally stays the same for all files in the program/plugin. You can also section your code to multiple namespaces, e.g. JohnClassiCubeLand.HeIsAngry, for if John ClassiCube is really mad at one of our players, and a part of the plugin (if it's multi-file) decides he wants to chop up the player. Note that most times, plugins are single-filed. The reason why this is the case is because a) This allows us to reference other plugins, and b) Many smaller plugins/projects can be compiled quickly with the built-in /compile command, which will save our time from having to locate the compiled DLL and then drag and drop it to our server's plugins folder. In this case, the code can have multiple classes in one single file, and/or have regions defined allowing us to collapse/expand different sections of the code. Example of using regions: 2) We have created the class NotifyPlayer. However, as you see in the screenshot, the class name is underlined red, and on the bottom of the IDE we see there are 3 errors. The reason why this is happening can be explained by the concept of Inheritance. Inheritance comes into play The idea of inheritance or metamorphism can be explained by giving you this analogy: Suppose we are creating a video game and we need to create two objects in the game, a car and a horse. It is agreed that both the car and the horse are vehicles, because they move, but it's just that the way they move are different. Hence, in programming, we can represent both the car and the horse as vehicles, but because the way they move are different, and the noises they make are also different, we need to have a way to define how they function. That is where interfaces and abstract classes come in! This analogy can be associated to what we are doing. There are many plugins on the server, and while not all of them do the same thing, they all need to register and unregister things upon being loaded and unloaded. Therefore, the Plugin abstract class is created for the management of the plugins, and serves as the parent class of them. Using Visual Studio, pressing Ctrl + . will bring up a context menu, and clicking Implement abstract class should fill the body of the NotifyPlayer class with the following code: public override string name => throw new System.NotImplementedException(); public override void Load(bool auto) { throw new System.NotImplementedException(); } public override void Unload(bool auto) { throw new System.NotImplementedException(); } I want you to notice two things: 1) All of these throws exceptions, which we'll replace with what is needed to make the plugin work, and 2) The exceptions all have System. in front of them. The reason why this is happening is because, at least for my file, the using statements were all deleted. In any circumstance, you can choose to include the using statement at the very top of the file, or you can choose to retrieve a method/use anything from a class by typing Namespace.Class instead. Below is how the above code was fixed. public override string name { get { return "NotifyPlayer"; } } public override string creator { get { return "75"; } } public override void Load(bool auto) { } public override void Unload(bool auto) { }Explanations to what I've done above: 1) We're using get return because we're overriding a string, and the parent class, Plugin, is expecting a getter method so it can retrieve the name of the plugin. You can also use a fat arrow lambda expression (=>) instead to do the same thing, which would be public override string name => "NotifyPlayer"; Lambdas are complex expressions that are used to create anonymous functions, and that is out of the scope of this guide. You can view more about them here: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-expressions. Please do note that lambdas are not compilable via the standard MCGalaxy compilers. 2) I have also overridden the creator property, which allows us to put the author name (sadly it's not John ClassiCube himself). This will mention our name if the plugin fails to load or unload. I also want you to notice this property was not included in by default, as over the years properties like welcome, MCGalaxy_version, Help, and creator have become optional. These are called virtual properties/methods, which can be viewed here: https://github.com/ClassiCube/MCGalaxy/blob/86af8c8f270f9cfb90798890e829de374c9e412a/MCGalaxy/Scripting/Plugin.cs 3) Given that the properties mentioned in (2) are optional/virtual, the property name, and the methods Load and Unload are required/abstract methods, which can be seen from the above link to the Plugin.cs file. By typing the override keyword however, you will be able to see all available options to override from. Now, let's start with what we want to do with the plugin. We want to let the player know upon joining the server whether or not that John ClassiCube is mad at them, we want there to be a command for the player to check the reason(s) why John ClassiCube is mad at the player, and give the options for staff member, and even JohnClassiCube himself (who is AndrewPH in disguise, who in reality does not even exist!) to add/delete/view the reason why the player is now on John ClassiCube's not-so-good player list. Events I've updated the Load and Unload methods with the following things: public override void Load(bool auto) { OnPlayerConnectEvent.Register(HandlePlayerConnect, Priority.Low); Command.Register(new CmdJohnClassiCubeNotifications()); } public override void Unload(bool auto) { OnPlayerConnectEvent.Unregister(HandlePlayerConnect); Command.Unregister(Command.Find("JohnClassiCubeNotifications")); } private void HandlePlayerConnect(Player p) { } I've done the following: 1) I registered the OnPlayerConnectEvent. Different events, and what they do are all outlined in MCGalaxy's events folder: https://github.com/ClassiCube/MCGalaxy/tree/86af8c8f270f9cfb90798890e829de374c9e412a/MCGalaxy/Events These events allow you to perform an action when a player performs certain action, for example, running a command, sending a chat message, moving, joining another level. Hooking into events would allow you to do a certain action based on what is provided to you. In our case, we will be notifying the player of them having a notification from John ClassiCube. 2) We've registered and unregistered a Command class that we will be making soon. Registering a command is simple, all we are doing is passing a newly instantiated command to the Register method. Unregistering the command though will require us to find the loaded instance first. For this bit, I will need to give you one note: Do NOT unregister new CmdJohnClassiCubeNotifications(); This will not work because Unregister acts like removing items from a list. This newly instantiated object is not the same as the one we registered before! One way to avoid using Command.Find is to store CmdJohnClassiCubeNotifications into a static variable, and unregister that variable instead. Storing user's data Because we need to store the player's notifications, we will need some way to write each player's notifications into the server files. Thankfully, with MCGalaxy, we are given a built in feature, namely PlayerExtList and also PlayerList. These two classes allows us to retrieve data from a text file. PlayerList stores player names into a text file, with each line having one player. You can use Contains, Add, Remove to manipulate the data. Each time Add or Remove is called, you must call the Save method so it can update the data to the text file, if not it will be stored only temporarily in memory. PlayerExtList stores player names and some corresponding data into a text file, with each line being the player's name, followed by a space, and some data. You can use Contains, Update, Get, Remove to manipulate the data. Each time Update or Remove is called, you must call the Save method so it can update the data to the text file, if not it will be stored only temporarily in memory. TL;DR PlayerList retrieves data from a text file and creates a temporary List to store the data, and allows you to do read/write to the list, and you need to call Save() each time for the data to be updated to the text file. PlayerList retrieves data from a text file and creates a temporary Dictionary to store the data, and allows you to do read/write to the Key-value pairs, and you need to c all Save() each time for the data to be updated to the text file. So, now we will be setting up a PlayerExtList to store each player's notifications. public class NotifyPlayer : Plugin { public override string name { get { return "NotifyPlayer"; } } public override string creator { get { return "75"; } } public const string PATH = "plugins/NotifyPlayer/"; public const string PATH_NOTIFICATIONS = PATH + "notifications.txt"; public static PlayerExtList notificationsList; public override void Load(bool auto) { notificationsList = PlayerExtList.Load(PATH_NOTIFICATIONS); OnPlayerConnectEvent.Register(HandlePlayerConnect, Priority.Low); Command.Register(new CmdJohnClassiCubeNotifications()); } public override void Unload(bool auto) { OnPlayerConnectEvent.Unregister(HandlePlayerConnect); Command.Unregister(Command.Find("JohnClassiCubeNotifications")); } private void HandlePlayerConnect(Player p) { string data = notificationsList.Get(p.name); if (!string.IsNullOrEmpty(data)) p.Message("You have &e{0}&S notifications from John ClassiCube. &WView it immediately, or else. &T/jccn", data.Split(',').Length); } }WOW! That was a lot of changes. I will take some time to explain to you what each line does. We've created two constant variables. Constant variables are read-only, compile time variables that store data that can only be read and not modifiable during run time, and does not require a object reference (meaning it's basically static!). These two variables are the paths to our plugin's folder, and the notifications text file to store data I added a public static PlayerExtList which stores player notifications. It is public static because it needs to be accessible outside of the class without being instantiated in an object. I added one line before registering the OnPlayerConnectEvent handler, which is PlayerExtList.Load. This will retrieve the data and load it into memory, or if the text file does not exist, it will create a new empty text file and instantiate an empty list of Key-value pairs. I updated the body of HandlePlayerConnect, and it will now check for if a player has notifications and alert the player upon connect to view the notifications. We're using a extension method from MCGalaxy, namely Split, to split the string by chopping it by where there is a comma (,), and then getting the number of items there are. The notifications in the text file would then look like this: 75+ Notification1,Notification2,Notification3Custom Command Now it's the time to create our command! public class CmdJohnClassiCubeNotifications : Command2 { public override string name { get { return "JohnClassiCubeNotifications"; } } public override string shortcut { get { return "jccn"; } } public override CommandPerm[] ExtraPerms { get { return new[] { new CommandPerm(LevelPermission.Operator, "can set and view all players' notifications") }; } } public override string type { get { return CommandTypes.Information; } } public string[] GetNotifications(string player) { string data = NotifyPlayer.notificationsList.Get(player); if (string.IsNullOrEmpty(player)) return null; else return data.Split(','); } public void NotificationPrinter(Player p, string notification) { p.Message("- &f" + notification); } public override void Use(Player p, string message, CommandData data) { string[] args = message.SplitSpaces(3); if (args[0].CaselessEq("add")) { if (!CheckExtraPerm(p, data, 1)) return; if (3 > args.Length) { p.Message("You need more parameters."); return; } string matched = PlayerInfo.FindMatchesPreferOnline(p, args[1]); if (string.IsNullOrEmpty(matched)) return; List<string> notifications = new List<string>(GetNotifications(matched)); notifications.Add(args[2]); NotifyPlayer.notificationsList.Update(matched, notifications.Join(",")); NotifyPlayer.notificationsList.Save(); p.Message("Notification was added."); } else if (args[0].CaselessEq("del")) { if (!CheckExtraPerm(p, data, 1)) return; if (3 > args.Length) { p.Message("You need more parameters."); return; } string matched = PlayerInfo.FindMatchesPreferOnline(p, args[1]); if (string.IsNullOrEmpty(matched)) return; List<string> notifications = new List<string>(GetNotifications(matched)); string notification = Matcher.Find(p, args[2], out int matches, notifications, null, null, "notification"); bool removed = false; if (notification != null) { notifications.Remove(notification); NotifyPlayer.notificationsList.Update(matched, notifications.Join(",")); NotifyPlayer.notificationsList.Save(); removed = true; } p.Message("{0} rmoved the notification from {1}.", removed ? "&aSuccessfully" : "&cCould not", p.FormatNick(matched)); } else { //elvis operator string player = message.Length == 0 ? p.name : PlayerInfo.FindMatchesPreferOnline(p, message); if (string.IsNullOrEmpty(player)) return; if (player != p.name && !CheckExtraPerm(p, data, 1)) return; string[] items = GetNotifications(player); Paginator.Output(p, items, (p_, notification) => NotificationPrinter(p_, notification), "JohnClassiCubeNotifications " + player, "notifications", args.Length > 2 ? args[1] : ""); } } public override void Help(Player p) { p.Message("&T/JohnClassiCubeNotifications <player>"); p.Message("&HViews the notifications that you or another player has from John ClassiCube."); p.Message("&T/JohnClassiCubeNotifications add [player] [notification]"); p.Message("&HAdds a notification to the player"); p.Message("&T/JohnClassiCubeNotifications del [player] [notification]"); p.Message("&HDeletes a notification from the player"); } }WOAH! That's so much more stuff to take in. You might be asking, what is all this? Well, let's sort this all through one by one. A. General structure of the code All commands generally will follow the same class header, with it being Cmd[name] : Command or Cmd[name] : Command2. When I say generally, I mean it because there are abstract classes that inherit either Command or Command2, and does something specific. This can be seen with the example of EntityPropertyCmd and RoundsGameCmd, where one is used for changing properties of a bot or a player (e.g. skins and models), or RoundsGameCmd where the command inherits this for unified functionality as a RoundsGame game mode command. The general differences between Command and Command2 is this: Command requires you to override name, type, Use(Player p, string message), and Help(p). Command2 requires you to override name, type, and Help(p), with Use(Player p, string message) being optional, and also allows you to override another optional overload of Use, being Use(Player p, string message, CommandData data). The CommandData object passed provides information about where the command is ran, the coordinates of the Message Block if available, and the rank that the player ran as (in which, we don't check for the rank of the player because the player could be running the command via /sendcmd and extra permissions needs to be bypassed). We're using Command2 because we need to check for extra command permissions using the method CheckExtraPerms to check if the player has staff permissions to manipulate player data. As said earlier, typing just the override keyword will show up the properties and methods you are allowed to override... Help(Player p, string message) is an overridable method for providing additional information for the command if they player types /help command <args>, where the message parameter is <args> most others are self explanatory, so I will just leave it at that B. The Body of the Use Method, and the two helper methods The string.SplitSpaces extension method is also a feature that comes from MCGalaxy. This method allows us to split a string into a string array by chopping it up by where there is a space. It also has an overload to limit the maximum of items we can have in that array. In this case as we specified 3 as the parameter, the method will chop at space A, and space B, and then leave the rest as the 3rd item. Then, we use args[0].CaselessEq(...) to check for if the string caseless equals a certain subcomand. In which, CaselessEq is also a built in method. There is also CaselessStarts, CaselessEnds, CaselessContains for strings. CaselessContains is also available for enumerable lists. We use PlayerInfo.FindMatchesPreferOnline(Player p, string name), which is a built in MCGalaxy method to find the exact name of a player as it is stored in the server database so to find the data matching the exact name of the player, and this method returns null if no players of the name is found, which is why we return when that is the case. You can simply check if it equals null, but I just prefer using string.IsNullOrEmpty because it sounds very fancy. ...and that's mostly it Wrap up That's it! You can view the full code here: https://gist.github.com/SpicyCombo/a9034c4912d82b082378aa08a789e2f2 Now of course, that was not everything. There may be a comment or a follow up post either by me, or some other community in the community. For other developers, a few other topics you can talk about are: //reference and //pluginref, the usage of external libraries and referencing other plugins Manipulating the Database Registering/Unregistering TopStat (which is easy, someone can just post the links down to an example) Custom events (which Venk has done, and I've done so as well.. idk If I'd like to share it though) Other Tidbits1) Reading the GitHub MCGalaxy wiki, and expanding the section "Technical info (for developers)" will provide information on commands to compile and load the plugin using the built-in compiler, and API changes/breakages: https://github.com/ClassiCube/MCGalaxy/wiki/Scripting. You should check here if you see something built in not working, and you need to fix it. 2) If you are using Visual Studio 2019, it's recommended to use the hotkey Ctrl + Shift + S every now and then to save all files in your project. This will avoid surprises if your computer suddenly loses power, this is so your changes are saved before anything out of ordinary happens. Final wordsWith anything in life, the more effort you put into something, the more you will get out of it. If you ever get stuck writing code, or need some concept explained to you, feel free to ask someone in the community for help. The forums, ClassiCube Discord, server owners/developers will be here when you need it. With all that being said, I wish you all, the readers the best of luck, and hope your next project will succeed (with a lot of glory). :D 75 is your Helpful Coding Assistant (HCA) [transmission ended]5 points
-
Stop wasting time
5 pointspretty sure all the servers are binary unless there's been a breakthrough and now there are servers running on unary and trinary cpus.5 points
-
hide gui button for mobile classicube
On the mobile version of classicube i would suggest to add an on-screen control that lets you hide the gui of your game.5 points
-
I'm new at classicube!
5 points
-
New avatars on the forum
5 pointsfirst, find skin Then download the skin u want.. go on CC click on your name, click then click the skin file press and boom u got a skin5 points