Welcome to TRiBot Forums

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

Sign in to follow this  
Followers 0

Peticca10 Scripter Appilaction

8 posts in this topic

1) Snipplets:

  1. Highlight Walking Path [http://pastebin.com/8hkZKZjk[https://tribot.org/forums/topic/38072-highlight-walking-path/]
  2. Highlight Model [http://pastebin.com/nq1kBBpC[https://tribot.org/forums/topic/38073-highlight-model/]

2) Tutorials: [N/A]


3) Randoms/updates submitted: [N/A]

4) Scripts available to the public: 

  1. AIOMiner [https://tribot.org/f...ores-any-place/] [ https://github.com/Cuhlifa/AIOMiner]
  2. AIOChopper [https://tribot.org/f...l-highlighting/] [ https://github.com/Cuhlifa/AIOChopper]
  3. EssenceMiner [https://tribot.org/f...t-highlighting/] [ https://github.com/C.../EssenceMiner--]

5) Short biography / Coding Experience:

I've been developing with Java for 3 years and have loved every minute of it from Andriod Apps to Minecraft server APIs. I've been interested in Runescape

since I was a kid but never really got into the development of the game and other more technical aspects until about a year ago. I started scripting on Powerbot

but the owners recently ruined the community and became extremely greedy for money so I moved over to Tribot and haven't regretted the decision.


I touched on it above but I am a contributor on the Bukkit project (a Minecraft server API). Whoever is reading this may or may not know what that is. Instead of me telling you about it if your interested and want to know what I am a part of in the Minecraft community this http://bukkit.org/ will tell you more.

6) Reasons why you feel you deserve Scripter:

Although, I am quite new to this Tribot community I believe I can contribute immensely to this community and the scripter rank would just increase my contribution capabilities. I think I have proved my self to the community and in my mind I do deserve scripter but the decision is yours.

7) What you plan to provide the community with: [1-3 short Paragraphs]

I will provide the community with more free high quality open source scripts that hopefully improve the tribot experience and maybe encourage

some more members to take up scripting as a hobby.


8) Do you agree to continue to not only update, but provide more free, open sourced scripts to the community?

As stated above, yes.

Share this post

Link to post
Share on other sites

no poll and no, all you did was spam your post counts honestly, just another reason for me to say no

1 person likes this

Share this post

Link to post
Share on other sites

The whole requirement for 100 post count is to join the community and be a part of it, not just post completely pointless things





Edited by Arckos

Share this post

Link to post
Share on other sites

Just some more grave dig, some already answered or just pure spam tbh. Not even going to bother going through any more posts











Bascially what arckos said. It doesn't look very good when you just suddenly gain a huge boost in post count when your scripter application got denied for post count, then you suddenly apply again once you reach around 100.


Your code is missing null checks and length checks. You should be following java conventions so it's easier for us to read.

	if (Objs.length > 0 && Inventory.getCount(PICKAXE_HANDLE) > 0				|| Equipment.getCount(PICKAXE_HANDLE) > 0) {			if (Objs[0].isOnScreen()) {

You are only checking the length if you have the pickaxe handle in your inventory, not if it's equipped.

RSItem[] head = Inventory.find(PICKAXE_HEADS);					RSItem[] handle = Inventory.find(PICKAXE_HANDLE);					if (head[0].click("Use")) {

No length checks on head or handle


You don't have to reset your item_interaction, iirc.


Just incase you didn't know, you can use General.random(int min, int max) to get a random number.

if (General.random(0, 10) == 5) {					org.tribot.api2007.Camera.setCameraRotation(Angle);				}				if (Rocks.length > 1 && Rocks[0].isOnScreen()						&& Rocks[0].getModel().getVertexCount() < 150) {

You need to store Rocks[0] model and null check that model, it will be more efficient as well.

	RSObject[] Objs = Objects.getAll(30);				for (RSObject obj : Objs) {					if (obj.getDefinition().getName().equalsIgnoreCase("Rocks")							&& !containsID(obj.getDefinition().getID())) {						for (Polygon p : obj.getModel().getTriangles()) {							g2d.setColor(Color.RED);							g2d.draw(p);						}					}				}

This is seriously cpu inefficient and you should be properly storing them in a variable and null checking them. Remember that the paint thread is looping every MS or somewhere around there, I believe. As well I suggest you just remove your random rotation antiban and just use ABCUtil#performCameraRotation or whatever (The naming is off, look in docs you'll find it)

long RunTime = (System.currentTimeMillis() - StartTime) / 1000;		long hours = TimeUnit.SECONDS.toHours(RunTime);		long minutes = TimeUnit.SECONDS.toMinutes(RunTime				- TimeUnit.HOURS.toSeconds(hours));		long seconds = RunTime				- (TimeUnit.HOURS.toSeconds(hours) + TimeUnit.MINUTES						.toSeconds(minutes));

You can shorten this down by Script#getRunningTime() & Timing#msToString



You still do not meet the requirements found here : https://tribot.org/forums/topic/32245-scripting-knowledge-requirements/


My answer remains no, we all forget null checks now and then but it's completely over your entire scripts (I'm just looking at your miner at the moment.) You should fix them before attempting to reapply.


I'm really exhausted and haven't slept in over 24 hours so this post might be really sloppy, but good luck with your script writer application. I highly doubt it will get approved but the ultimate decision is upon trilez and usa. Work harder, spend some time learning from open source scripts or from an java book / tutorial. You'll get to the script writer rank level eventually!



Some things you need to work on (from what I noticed right off the bat):

Edited by erickho123
1 person likes this

Share this post

Link to post
Share on other sites

Highlight Walking Path [http://pastebin.com/8hkZKZjk]

- Does not compile. Graphics#draw does not exist, you also have 2 for loops.


- Most of your variables are public, but not static. If you are accessing these variables from other classes they will need to be static. If you are not, this shouldn't affect the way your script runs, but it makes me question your java knowledge.

- Don't set the mouse speed in the onPaint method.

- You should null check Overlay, currently if the image fails to load for whatever reason a NullPointerException will be thrown and your paint will not work.


- If anything fails to return true in your execute method, it's going to run everything again, even when not needed.


- Portal may not be null, but Portal[0] can still be. You don't check to see if it is null until you've already called upon it.


- RuneEssence isn't length checked and RuneEssence[0] isn't null checked.


- Once again, you length checked the array, but didn't null check Aubury[0].

I only looked at your essence miner and I would say no just off of that. You say you have been working with java for 3 years, but there's an abundance of examples in your code that makes me think otherwise. I would also have thought after 3 years you would have picked up on the java naming conventions.

Your 2 biggest problems in your essence miner were static sleeps and null/length checking arrays, but not null checking the value from the array.

Here's 3 examples of dynamic sleeps I made for someone else a while ago: http://pastebin.com/Yc7fFTTR

In accordance to the null/length checking, all of the arrays you were using in your code do not need to be null checked as they return an empty array instead of null. There are a few exceptions to this so be on the lookout. Also, just because an array has a length greater than 0, doesn't mean array[0] is not null.

There's probably more knit picky things others can point out, but those were the 2 biggest that stood out to me.

Edited by Encoded
1 person likes this

Share this post

Link to post
Share on other sites

I find it difficult to believe that you've been studying java for 3 years and still do not know the conventions for readable and correct code. It's very difficult to go through each of your classes because of that. I suggest you read this document to start off. It's 15 years old, but that doesn't mean it's completely out of date, it just means java is a very stable language. If you really want to get into the specifics of convention and proper language usage with more updated and detailed information, then check out this document.


Secondly, you don't meet either of the scripter knowledge requirements posted by TRiLeZ which you should go over a few times to make sure you understand them.




Miner++ (Miner.java)

public void findPickaxeHead() {		RSGroundItem[] Objs = GroundItems.find(PICKAXE_HEADS);		if (Objs.length > 0 && Inventory.getCount(PICKAXE_HANDLE) > 0				|| Equipment.getCount(PICKAXE_HANDLE) > 0) {			if (Objs[0].isOnScreen()) {				if (Objs[0].click("Take")) {					sleep(AntiBan.DELAY_TRACKER.ITEM_INTERACTION.next());					AntiBan.DELAY_TRACKER.ITEM_INTERACTION.reset();					RSItem[] head = Inventory.find(PICKAXE_HEADS);					RSItem[] handle = Inventory.find(PICKAXE_HANDLE);					if (head[0].click("Use")) {						sleep(AntiBan.DELAY_TRACKER.ITEM_INTERACTION.next());						AntiBan.DELAY_TRACKER.ITEM_INTERACTION.reset();						handle[0].click("Use");
if (Rocks.length > 1 && Rocks[0].isOnScreen()						&& Rocks[0].getModel().getVertexCount() < 150) {					if (DynamicClicking.clickRSModel(Rocks[0].getModel(),							"Mine")) {						CurrentlyMining = Rocks[0];						if (Rocks[1] != null) {							MineNext = Rocks[1];						}

Chopper++ (Chop.java)

final RSObject[] Trees = Objects.findNearest(50, AIOChopper.Selectedtree);		if(AIOChopper.AntiBan.BOOL_TRACKER.USE_CLOSEST.next() || Trees.length < 2){			if(Trees != null && Trees.length > 0){				if(Trees[0].isOnScreen()){
if(canChop(Trees[0].getPosition()) && DynamicClicking.clickRSModel(Trees[0].getModel(), "Chop down")){						AIOChopper.CurrentlyChopping = Trees[0].getModel();						RSModel TreeModel1 = Trees[1].getModel();						if(TreeModel1 != null){AIOChopper.NextToChopChopping = Trees[1].getModel();}

The below snippet I think you tried to make sure exceptions wouldn't be thrown, however if you try to check index 1 for being null before you check if index 1 actually exists then you will still get an ArrayIndexOutOfBoundsException

if(Trees[1] != null && Trees.length > 1){

EssenceMiner++ (Mine.java)

RSObject[] RuneEssence = Objects.findNearest(30, "Rune Essence",				"Pure Essence");		if (RuneEssence[0].isOnScreen()) {

The below snippet is weird, you cached the value returned for getModel() and then null checked it, but then didn't use it for your clicking.

RSModel RuneEssenceModel = RuneEssence[0].getModel();			if (RuneEssenceModel != null) {				DynamicClicking.clickRSModel(RuneEssence[0].getModel(), "Mine");			}

I am sure there are more examples of this, but I would assume that these examples are enough to help you understand what you're not doing correctly.



Next, you don't seem to know the difference between the public and private modifiers as it seems like you're just throwing them in front of different variables and methods with no real purpose. I suggest looking at the oracle tutorial to learn the proper usages of each (you'll find the protected modifier in that tutorial as well which is something you should also learn even though you're not using it right now).



Following the above statement, I think you need to work on class structure.


Notes for class structure:


Miner++ (Miner.java)

You shove almost all of your code into one class which makes it very difficult to read (not only for others, but for you as well) and it also doesn't make sense.

A lot of the helper methods or high level methods you have written in this class do not belong there. The same goes for most of the variables you have stored in this class.

Miner.java is a Script, it contains the overridden run() method, and in your case implements the interface Painting. All it should be used for is running the executable code that will do the things your Script is supposed to and painting (it would also be a good idea to separate some of your painting code into another or multiple classes and create helper methods to make the onPaint() method more manageable).



In this package, you store a lot of classes that do not relate to each other. Try organizing them in a way that makes sense. Here is one possibility:











Generally you shouldn't only have one class in a package, but if you feel more organized you could make a package for GUI.java if you wanted, otherwise just include it in src\scripts\.


I'm not going to make examples for your other scripts, but this should suffice as a short example on how to use packages. For more details on packages, you can refer to the oracle tutorial on packages.


EssenceMiner++ (EssenceMiner.java)

The same things apply here that I stated for Miner++ (Miner.java) above however with this script it looks as if you organized most of your methods into other classes except for isInMine().

I really recommend creating some sort of data container for most of your variables, and then storing the rest in the proper classes.


Variable organization notes (EssenceMiner.java):

The following fields that are used to store information related to runtime stats should be stored with each other:

public int CurrentLevel;public int InventoryCount;public int CurrentXP;public int GainedLevel;public int GainedXP;public int GainedXPHour = 0;public long hours;public int MinedOres = 0;public int MinedOresHour = 0;public long minutes;public int Profit = 0;public int ProfitHour = 0;public long RunTime;public long seconds;public int StartingLevel;public int StartingXP;public long StartTime;

The following fields related to painting should be stored together:

public RSModel Essence = null;public RSTile[] path;public Image Overlay;

Lastly, you should store any constant fields that relate to each other in one class or multiple depending on what the fields are. The only one I saw in EssenceMiner++ was PICKAXES (EssenceMiner.java: 51).


How you store them is up to you, just know that a static implementation will disallow your script to be ran properly on a single client with multiple tabs unless you use a singleton pattern which you can read about here.



The next thing I see that seems to be an issue is the use of conditional statements. It seems like you understand how to use the return value of a boolean method, but you don't structure your statements in correct chains or nests.


Notes on conditional statements:

EssenceMiner++ (Bank.java)

The below snippet does not make much sense. You do not need to check whether or not you successfully walked to the bank every time you want to open it, rather you'd want to check if you are in a bank and if the bank is not open before opening the bank. You also need to use else and else if statements to get the results you want in this scenario.

if (WebWalking.walkToBank()) {			if (Banking.openBank()) {				System.out.println("Opening bank");				General.sleep(300, 550);				if (Banking.isBankScreenOpen()) {

Here is a correct implementation of the snippet above (ignore whitespace formatting):

if (!Banking.isInBank()) { //or write a method to check if a bank is on screen            WebWalking.walkToBank();        } else {            if (!Banking.isBankScreenOpen()) {                Banking.openBank();            } else {                if (Banking.depositAllExcept(EssenceMiner.MainMiner.PICKAXES) > 0 && Banking.isBankScreenOpen()) {                    Banking.close();                }            }        }

You also should probably separate your walking into different nodes because specificity is going to make your script a lot more stable and it will be easier to read.



All of the above things are core things you should understand before writing a full scale application. Now I will move onto things focused on the usage of the TRiBot api.




The onPaint() method should be used for nothing other than drawing things and modifying the Graphics object that you are given as a parameter. You do lots of calculations and call a lot of methods in your onPaint() which is horribly intensive on cpu's because the method is called many times per second on another thread.


Things you should remove and put elsewhere inside your onPaint() method:

Miner++ (Miner.java):

Mouse.setSpeed(General.random(95, 110));long RunTime = (System.currentTimeMillis() - StartTime) / 1000;		long hours = TimeUnit.SECONDS.toHours(RunTime);		long minutes = TimeUnit.SECONDS.toMinutes(RunTime				- TimeUnit.HOURS.toSeconds(hours));		long seconds = RunTime				- (TimeUnit.HOURS.toSeconds(hours) + TimeUnit.MINUTES						.toSeconds(minutes));RSObject[] Objs = Objects.getAll(30);if (obj.getDefinition().getName().equalsIgnoreCase("Rocks")							&& !containsID(obj.getDefinition().getID())) {for (Polygon p : obj.getModel().getTriangles()) {RSObject[] Objs1 = Objects.find(30, Integer.valueOf(gui							.getList_Ores().getSelectedItem()));for (Polygon p : Obj.getModel().getTriangles()) {RSObject[] Objs = Objects.find(30, SelectedOres);for (Polygon p : Obj.getModel().getTriangles()) {for (Polygon p : CurrentlyMining.getModel().getTriangles()) {for (Polygon p : MineNext.getModel().getTriangles()) {

EssenceMiner++ (EssenceMiner.java):

Mouse.setSpeed(General.random(110, 140));for (Polygon p : Essence.getTriangles()) {

Chopper++ (AIOChopper.java):

RunTime = (System.currentTimeMillis() - StartTime) / 1000;		hours = TimeUnit.SECONDS.toHours(RunTime);		minutes = TimeUnit.SECONDS.toMinutes(RunTime				- TimeUnit.HOURS.toSeconds(hours));		seconds = RunTime				- (TimeUnit.HOURS.toSeconds(hours) + TimeUnit.MINUTES						.toSeconds(minutes));for(Polygon p : CurrentlyChopping.getTriangles()){for(Polygon p : NextToChopChopping.getTriangles()){

It's fine to create variables inside these methods and to call certain methods such as Skills.getXP(...) because Skills.getXP(...) is not an expensive method.


However, calling Objects.getAll(...) especially with a large range (30 in your case which would be an area of 900 tiles) is not a good idea. It might not be as expensive as something like PathFinding.generatePath(...), but it does not belong inside your onPaint(...) method. What you should be doing is one of the following:

  • Create a separate thread that runs a few times per second that does all of the calculations for retrieving the information you want such as the polygons of certain objects (if you are going to be using this approach, I recommend you read this oracle tutorial on what exactly you're getting into when doing this)
  • Do the calculations for retrieving the information you want inside your loop where applicable (e.g. set the rock you are currently mining and then get the polygon of that rock only when your script chooses the rock to mine which you are already half-doing. Then, simply draw the polygon in your onPaint(...) method which will be much more efficient).

In all of your scripts you call RSModel.getTriangles() and then you iterate that array and draw each one. Instead of drawing all of that, why not simply call RSModel.getEnclosedArea() which will return the bounds of that model rather than the polygons that make up the entire model. It will have the same effect (highlighting models) but it will be a lot more efficient.


Also, you should not be running any executable code inside your onPaint(...) method that does not pertain to what you're going to be drawing. The only thing I saw that would be an example of this is when you call Mouse.setSpeed(...) (Miner.java: 401) and Mouse.setSpeed(...) (EssenceMiner.java: 108).


Another thing you should know when drawing anything in your onPaint(...) method is that you need to check to make sure what you're drawing is never null, otherwise tons of stack traces will be printed inside the Bot Debug which will only hurt your scripts performance.


You can check for null objects in two places:

  • Before drawing the object inside your onPaint(...) method
  • Making sure any object returned by a method call in the onPaint(...) method will never return null

The last thing I noticed relating to painting is you do your own calculations for generating the seconds, minutes, and hours of runtime for your script. The TRiBot api has all of the tools needed to do this for you. The classes that would help you in this case would be the Timing and Script classes.


Here are two ways to get the running time of your script with the TRiBot api:

long startTime = Timing.currentTimeMillis();long runningTime = Timing.currentTimeMillis() - startTime;String formattedRunningTime = Timing.msToString(runningTime);

The above code would give you control over when you decide you want to say your script started (e.g. after a GUI has been filled out and closed).



String formattedRunningTime = Timing.msToString(this.getRunningTime());//this field must be initialized inside your Script, otherwise you will //need to give the class/method you are initializing this field in access//to the Script

The above code works just as well as the other method, however your start time will always be right after the user presses 'Start' on the script manager dialog.



Clicking and mouse movements:

I see you use a mixture of methods to click and move the mouse (Clickable.click, DynamaicMouse, DynamicClicking), but you do not need to use these anymore since TRiLeZ added the Clicking class to the api. 


The Clicking class is controlled by ThreadSettings, so you can change on the fly whether or not to use dynamic clicking by calling the method ThreadSettings.get().setClickingAPIUseDynamic(...). Use this whenever you are going to hover/click a Clickable.


Another thing is that any time you click or hover something you would most likely want to check whether or the click or hover was successful. You can do this by checking the returned value from the method call (which I see in some cases you are already doing) and by checking the crosshair state right after the click(...) or hover(...) method returns.


Using the return values of methods:

In a lot of cases I see you either improperly using the return values for certain methods or not using them at all. Since writing a script is nearly entirely event based, you'll need to get a hold of how to use the return values for methods properly.


The most common example I see in your scripts of not using return values for methods is the Banking class.


Here are some of the places where you need to use return values:

Miner++ (Miner.java)

Banking.depositAllExcept(PICKAXES);sleep(100, 400);Banking.close();sleep(AntiBan.DELAY_TRACKER.NEW_OBJECT.next());AntiBan.DELAY_TRACKER.NEW_OBJECT.reset();InventoryCount = Inventory.getCount(OreNames);

EssenenceMiner++ (WalkToAubury.java)

DynamicClicking.clickRSModel(Aubury[0].getModel(), "Teleport");
DynamicClicking.clickRSModel(AuburyModel1, "Teleport");
Doors.handleDoorAt(tile, true);


Banking.depositAllExcept(EssenceMiner.MainMiner.PICKAXES);					General.sleep(EssenceMiner.AntiBan.DELAY_TRACKER.NEW_OBJECT							.next());					EssenceMiner.AntiBan.DELAY_TRACKER.NEW_OBJECT.reset();					Banking.close();					General.sleep(100, 250);					Walking.blindWalkTo(WalkToAubury.AuburyTile);


if(Portal.length > 1){DynamicClicking.clickRSTile(Portal[1].getPosition(), 1);}
Portal[0].hover(new Point(5, -5), new Point(2, -2));					General.sleep(100, 175);					if(Portal[0] != null && !DynamicClicking.clickRSTile(Portal[0].getPosition(), 1)){						if(Portal.length > 1){DynamicClicking.clickRSTile(Portal[1].getPosition(), 1);}					}


if (RuneEssenceModel != null) {				DynamicClicking.clickRSModel(RuneEssence[0].getModel(), "Mine");			}
if (RuneEssenceModel != null) {					DynamicClicking.clickRSModel(RuneEssence[0].getModel(),							"Mine");				}

I'm not going to go through Chopper++ because it takes a while to review all of this code. You should understand from these examples though.


Using ABCUtil correctly:

This is probably the most important part of a script and you use almost every tool incorrectly. The cases provided below are either incorrect usage of next(), putting reset() in the wrong place, and wrong code or code that does not make sense after next() is called.


Here are most of the cases of incorrect usage in your scripts (refer to TRiLeZ's tutorial on how to implement it correctly):

Miner++ (Mine.java)

if (AntiBan.BOOL_TRACKER.USE_CLOSEST.next() || Rocks.length < 2) {
if (AntiBan.BOOL_TRACKER.HOVER_NEXT.next()) {							sleep(AntiBan.DELAY_TRACKER.SWITCH_OBJECT.next());							AntiBan.DELAY_TRACKER.SWITCH_OBJECT.reset();							Rocks[1].hover(new Point(General.random(-13, 10),									General.random(-9, 5)), new Point(null));							AntiBan.BOOL_TRACKER.HOVER_NEXT.reset();						} else {							sleep(AntiBan.DELAY_TRACKER.SWITCH_OBJECT.next());							AntiBan.DELAY_TRACKER.SWITCH_OBJECT.reset();							Rocks[0].hover(new Point(General.random(-13, 10),									General.random(-9, 5)), new Point(null));						}
if (AntiBan.BOOL_TRACKER.HOVER_NEXT.next()) {								sleep(AntiBan.DELAY_TRACKER.SWITCH_OBJECT										.next());								AntiBan.DELAY_TRACKER.SWITCH_OBJECT.reset();								Rocks[1].hover();								AntiBan.BOOL_TRACKER.HOVER_NEXT.reset();							} else {								sleep(AntiBan.DELAY_TRACKER.SWITCH_OBJECT										.next());								AntiBan.DELAY_TRACKER.SWITCH_OBJECT.reset();								Rocks[0].hover();							}
if (AntiBan.BOOL_TRACKER.HOVER_NEXT.next()) {							sleep(AntiBan.DELAY_TRACKER.SWITCH_OBJECT.next() + 200);							AntiBan.DELAY_TRACKER.SWITCH_OBJECT.reset();							Rocks[0].hover(new Point(General.random(-13, 10),									General.random(-9, 5)), new Point(0, 0));							AntiBan.BOOL_TRACKER.HOVER_NEXT.reset();						} else {							sleep(AntiBan.DELAY_TRACKER.SWITCH_OBJECT.next() + 200);							AntiBan.DELAY_TRACKER.SWITCH_OBJECT.reset();							Rocks[1].hover(new Point(General.random(-13, 10),									General.random(-9, 5)), new Point(0, 0));						}

EssenceMiner++ (Mine.java) I am unsure of why this call to reset() exists


Chopper++ (Chop.java)


Your scripts are listed as ABCL 10 yet they either don't use ABCUtil correctly or if they did they would not come out to a score of 10. It's really in bad faith to falsely advertise your products and even though that doesn't have to do with your ability to write code, I thought I'd mention it because it's not something that people will be happy about.



I'm not going over anything else in your scripts because there is too much to talk about in one post, I think this post is already big enough as is. My vote for your application is no this time.


Anyways, my main motivation for writing this review on your application is because of this thread that you made.


Firstly, you have no posts on any of the premium script threads and you are not in my purchase logs for any of my scripts so I can safely assume you haven't even purchased one premium script to make the assertion that some free scripts are superior to any premium ones. You shouldn't insult people's work at all, but especially shouldn't when you haven't even seen the code or seen the application run yourself.


Secondly, it's ok to be proud of your work, but it's not ok to call it high quality and list it as such when it isn't. Me saying this is not to get you down in the dumps or to insult your work; I'm saying it because you need to understand that humility, the willingness to learn, and the ability to admit your work needs improvement are the most important assets a person can have when programming. If I brushed off every piece of advice I got while learning with a retort like you had on that thread I would probably not be a premium scripter and would be making some of the beginner errors when coding that you are making. This is not to say I am the best at programming or computer science, but I would like to think I have come a long way with my study, and you can come a long way as well if you are willing.


Good luck on your future application(s).

Edited by Starfox
3 people like this

Share this post

Link to post
Share on other sites

There are some good tips above about your code, but I tend to agree with them that there is a basic level of knowledge that we expect out of you if you are a Scripter. I'd say this application was close, continue improving and re-apply when you are ready.

Share this post

Link to post
Share on other sites
This topic is now closed to further replies.
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.