diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index b2d97634b..a7f6f8ba9 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -2,32 +2,41 @@ # TL;DR -Polyhedral Development is dedicated to providing a harassment-free experience for everyone, regardless of gender, gender identity and -expression, preferred pronouns, sexual orientation, disability, physical appearance, age, race, religion, etc. We do not tolerate harassment -of participants in any form. +Polyhedral Development is dedicated to providing a harassment-free experience +for everyone, regardless of gender, gender identity and expression, preferred +pronouns, sexual orientation, disability, physical appearance, age, race, +religion, etc. We do not tolerate harassment of participants in any form. -This code of conduct applies to all Terra community spaces, including the github discussions tab, our -[community discord server](https://discord.gg/PXUEbbF), the [community subreddit](https://reddit.com/r/TerraGenerator), or any other Terra -space, both online and off. Anyone in violation of this code, as determined by the applicable moderators, may be subject to verbal warning, -expulsion from these spaces, or future events and activities for an undetermined amount of time. +This code of conduct applies to all Terra community spaces, including the github +discussions tab, our [community discord server](https://discord.gg/PXUEbbF), +the [community subreddit](https://reddit.com/r/TerraGenerator), or any other +Terra space, both online and off. Anyone in violation of this code, as +determined by the applicable moderators, may be subject to verbal warning, +expulsion from these spaces, or future events and activities for an undetermined +amount of time. -Some Terra community spaces may have additional rules in place, which will be made clearly available to all participants. Participants are -responsible for knowing and abiding by these rules. +Some Terra community spaces may have additional rules in place, which will be +made clearly available to all participants. Participants are responsible for +knowing and abiding by these rules. # Longer version -Polyhedral Development is dedicated to providing a harassment-free experience for everyone. We do not tolerate harassment of participants in -any form. +Polyhedral Development is dedicated to providing a harassment-free experience +for everyone. We do not tolerate harassment of participants in any form. ## When and How to Use These Guidelines -This code of conduct applies to all Terra community spaces, both online and off. This applies to the github discussion tab, -the [Polyhedral Development community discord server](https://discord.gg/PXUEbbF), and any other Terra community. In addition, we may choose -to invoke them in instances of harassment outside the Terra communities, and we will punish the responsible individuals appropriately. We -will not tolerate harassment in any form, even outside of Terra. +This code of conduct applies to all Terra community spaces, both online and off. +This applies to the github discussion tab, the +[Polyhedral Development community discord server](https://discord.gg/PXUEbbF), +and any other Terra community. In addition, we may choose to invoke them in +instances of harassment outside the Terra communities, and we will punish the +responsible individuals appropriately. We will not tolerate harassment in any +form, even outside of Terra. -Some Terra spaces may have additional rules in place, which will be made clearly available to participants. Participants are responsible for -knowing and abiding by these rules, in addition to this code of conduct. +Some Terra spaces may have additional rules in place, which will be made clearly +available to participants. Participants are responsible for knowing and abiding +by these rules, in addition to this code of conduct. ## Expected Behavior @@ -35,33 +44,43 @@ The following behaviors are expected of all members of the Terra community: ### Be Respectful -Value each other's ideas, styles and viewpoints. We may not always agree, but disagreement is no excuse for poor manners. Be open to -different possibilities and to being wrong. Be respectful in all interactions and communications, especially when debating the merits of -different options. Be aware of your impact and how intense interactions may be affecting people. Be direct, constructive and positive. Take -responsibility for your impact, and your mistakes – if someone says they have been harmed through your words or actions, listen carefully, -apologize sincerely, and correct the behavior going forward. +Value each other's ideas, styles and viewpoints. We may not always agree, but +disagreement is no excuse for poor manners. Be open to different possibilities +and to being wrong. Be respectful in all interactions and communications, +especially when debating the merits of different options. Be aware of your +impact and how intense interactions may be affecting people. Be direct, +constructive and positive. Take responsibility for your impact, and your +mistakes – if someone says they have been harmed through your words or actions, +listen carefully, apologize sincerely, and correct the behavior going forward. #### Be Prepared to Admit When You are Wrong -Any member of the Terra community should always be open to new ideas and must always be open to the possibility of being wrong. Nobody can -always be right, and we are only human; we are [fallible](https://www.merriam-webster.com/dictionary/fallible) by nature. It is okay to make -mistakes, but we must be willing to admit when we make one. +Any member of the Terra community should always be open to new ideas and must +always be open to the possibility of being wrong. Nobody can always be right, +and we are only human; we are +[fallible](https://www.merriam-webster.com/dictionary/fallible) by nature. +It is okay to make mistakes, but we must be willing to admit when we make one. ### Be Direct but Professional -We are likely to have some discussions about if and when criticism is respectful and when it's not. We must be able to speak directly when -we disagree and when we think we need to improve. We cannot withhold hard truths. Doing so respectfully is hard, doing so when others don't -seem to be listening is harder, and hearing such comments when one is the recipient can be even harder still. We need to be honest and -direct, as well as respectful. +We are likely to have some discussions about if and when criticism is respectful +and when it's not. We must be able to speak directly when we disagree and when +we think we need to improve. We cannot withhold hard truths. Doing so +respectfully is hard, doing so when others don't seem to be listening is harder, +and hearing such comments when one is the recipient can be even harder still. We +need to be honest and direct, as well as respectful. ### Be Inclusive -Seek diverse perspectives. Diversity of views and of people on teams powers innovation, even if it is not always comfortable. Encourage all -voices. Help new perspectives be heard and listen actively. If you find yourself dominating a discussion, it is especially important to step -back and encourage other voices to join in. Be aware of how much time is taken up by dominant members of the group. Provide alternative ways -to contribute or participate when possible. +Seek diverse perspectives. Diversity of views and of people on teams powers +innovation, even if it is not always comfortable. Encourage all voices. Help new +perspectives be heard and listen actively. If you find yourself dominating a +discussion, it is especially important to step back and encourage other voices +to join in. Be aware of how much time is taken up by dominant members of the +group. Provide alternative ways to contribute or participate when possible. -Be inclusive of everyone in an interaction, respecting and facilitating people's participation whether they are: +Be inclusive of everyone in an interaction, respecting and facilitating people's +participation whether they are: - Not native language speakers - Coming from a different culture @@ -70,47 +89,60 @@ Be inclusive of everyone in an interaction, respecting and facilitating people's - Facing other challenges to participate - Or anything else. Be respectful of *everyone* at *all times*. -Think about how you might facilitate alternative ways to contribute or participate. If you find yourself dominating a discussion, step back. -Make way for other voices and listen actively to them. +Think about how you might facilitate alternative ways to contribute or +participate. If you find yourself dominating a discussion, step back. Make way +for other voices and listen actively to them. ### Understand Different Perspectives -Our goal should not be to "win" every disagreement or argument. A more productive goal is to be open to ideas that make our own ideas -better. Strive to be an example for inclusive thinking. "Winning" is when different perspectives make our work richer and stronger. That -means, you must pay attention to all ideas proposed. Don't disregard one without giving it the attention it deserves. +Our goal should not be to "win" every disagreement or argument. A more +productive goal is to be open to ideas that make our own ideas better. Strive to +be an example for inclusive thinking. "Winning" is when different perspectives +make our work richer and stronger. That means, you must pay attention to all +ideas proposed. Don't disregard one without giving it the attention it deserves. ### Appreciate and Accommodate Our Similarities and Differences -People come from many cultures and backgrounds. Cultural differences can encompass everything from official religious observances to -personal habits to clothing. Be respectful of anyone with different cultural practices, attitudes and beliefs. Work to eliminate your own -biases, prejudices and discriminatory practices. Think of others' needs from their point of view. Use preferred titles (including -pronouns[\[1\]](#1)) and the appropriate tone of voice. Respect people's right to privacy and confidentiality. Be open to -learning from and educating others as well as educating yourself; it is unrealistic to expect someone to know the cultural practices of -every ethnic and cultural group. Therefore we must be ready to correct someone if they make a mistake, and must be ready ourselves to change -and learn if we make a mistake. +People come from many cultures and backgrounds. Cultural differences can +encompass everything from official religious observances to personal habits to +clothing. Be respectful of anyone with different cultural practices, attitudes +and beliefs. Work to eliminate your own biases, prejudices and discriminatory +practices. Think of others' needs from their point of view. Use preferred +titles (including pronouns[\[1\]](#1)) and the appropriate tone of +voice. Respect people's right to privacy and confidentiality. Be open to +learning from and educating others as well as educating yourself; it is +unrealistic to expect someone to know the cultural practices of every ethnic and +cultural group. Therefore we must be ready to correct someone if they make a +mistake, and must be ready ourselves to change and learn if we make a mistake. ### Lead by Example -By matching your actions with your words, you become a person others want to follow. Your actions influence others to behave and respond in -ways that are valuable and appropriate for our organizational outcomes. Design your community and your work for inclusion. Hold yourself and -others accountable for inclusive behaviors. +By matching your actions with your words, you become a person others want to +follow. Your actions influence others to behave and respond in ways that are +valuable and appropriate for our organizational outcomes. Design your community +and your work for inclusion. Hold yourself and others accountable for inclusive +behaviors. ## Behavior That Will Not Be Tolerated -The following behaviors are considered to be unacceptable and will not be tolerated: +The following behaviors are considered to be unacceptable and will not be +tolerated: ### Violence and Threats of Violence -Violence and threats of violence are not acceptable - online or offline. This includes incitement of violence toward any individual, -including encouraging a person to commit self-harm, engage in self-harm, or put themselves in a negative position (e.g. one which can lead -to an increase of depression, etc.). +Violence and threats of violence are not acceptable - online or offline. This +includes incitement of violence toward any individual, including encouraging a +person to commit self-harm, engage in self-harm, or put themselves in a negative +position (e.g. one which can lead to an increase of depression, etc.). ### Personal Attacks -Conflicts will inevitably arise, but frustration should never turn into a personal attack. It is not okay to insult, demean or belittle -others. Attacking someone for their opinions, beliefs and ideas is not acceptable. It is important to speak directly when we disagree and -when we think we need to improve, but such discussions must be conducted respectfully and professionally, remaining focused on the issue at -hand. +Conflicts will inevitably arise, but frustration should never turn into a +personal attack. It is not okay to insult, demean or belittle others. Attacking +someone for their opinions, beliefs and ideas is not acceptable. It is important +to speak directly when we disagree and when we think we need to improve, but +such discussions must be conducted respectfully and professionally, remaining +focused on the issue at hand. ### Derogatory Language @@ -135,30 +167,40 @@ Offensive, unwelcome, or hurtful comments related to: - Socioeconomic status - Religion - Employment -- Or anything really. Just don't be offensive towards people, insult them, or make unwanted comments. +- Or anything really. Just don't be offensive towards people, insult them, or + make unwanted comments. -is not acceptable. This includes deliberately referring to someone by a gender that they do not identify with, and/or questioning the -legitimacy of an individual's gender identity. If you're unsure if a word is derogatory, don't use it. This also includes repeated subtle -and/or indirect discrimination; when asked to stop, stop the behavior in question. +is not acceptable. This includes deliberately referring to someone by a gender +that they do not identify with, and/or questioning the legitimacy of an +individual's gender identity. If you're unsure if a word is derogatory, don't +use it. This also includes repeated subtle and/or indirect discrimination; when +asked to stop, stop the behavior in question. ### Unwelcome Sexual Attention or Physical Contact -Unwelcome sexual attention or unwelcome physical contact is not acceptable. This includes sexualized comments, jokes or imagery in -interactions, communications or presentation materials, as well as inappropriate touching, groping, or sexual advances. Additionally, -touching a person without permission, including sensitive areas such as their hair, pregnant stomach, mobility device (wheelchair, scooter, -etc) or tattoos is unacceptable. This includes physically blocking or intimidating another person. Physical contact or simulated physical -contact (e.g. emojis like ":​kiss:", ":hug:", or ":kiss_mark:", textual descriptions like "\*hug\*", "\*backrub\*", or "\*kisses -you\*", etc.) without affirmative consent or after a request to stop will not be accepted. +Unwelcome sexual attention or unwelcome physical contact is not acceptable. This +includes sexualized comments, jokes or imagery in interactions, communications +or presentation materials, as well as inappropriate touching, groping, or sexual +advances. Additionally, touching a person without permission, including +sensitive areas such as their hair, pregnant stomach, mobility device ( +wheelchair, scooter, etc) or tattoos is unacceptable. This includes physically +blocking or intimidating another person. Physical contact or simulated physical +contact (e.g. emojis like ":​kiss:", ":hug:", or ":kiss_mark:", textual +descriptions like "\*hug\*", "\*backrub\*", or "\*kisses you\*", etc.) without +affirmative consent or after a request to stop will not be accepted. ### Sexual Behaviour Where it is Not Appropriate -Uninvited or off-topic sexual images, text, or behaviour in spaces where they're not appropriate will not be accepted whatsoever. We are an -open community, which means spaces must be appropriate for all ages, and everybody must feel comfortable. Discussion of sexual things, will -be prohibited unless otherwise noted. +Uninvited or off-topic sexual images, text, or behaviour in spaces where they're +not appropriate will not be accepted whatsoever. We are an open community, which +means spaces must be appropriate for all ages, and everybody must feel +comfortable. Discussion of sexual things, will be prohibited unless otherwise +noted. ### Discussion of Sensitive Topics -Discussion of sensitive topics when asked to stop, or when not appropriate. Including, but not limited to: +Discussion of sensitive topics when asked to stop, or when not appropriate. +Including, but not limited to: - Anything sexual - Gore @@ -167,171 +209,241 @@ Discussion of sensitive topics when asked to stop, or when not appropriate. Incl - Anything related to death - Or really anything that someone may be sensitive about. -shall not be tolerated. As a community for all ages and all kinds of people, we must cater to everyone, and must make sure everyone feels -comfortable here. Repeatedly breaking someone else's boundaries will not be tolerated. +shall not be tolerated. As a community for all ages and all kinds of people, we +must cater to everyone, and must make sure everyone feels comfortable here. +Repeatedly breaking someone else's boundaries will not be tolerated. ### Disruptive Behavior -Sustained disruption of events, forums, or meetings, online or otherwise, including talks and presentations, will not be tolerated. This -includes: +Sustained disruption of events, forums, or meetings, online or otherwise, +including talks and presentations, will not be tolerated. This includes: - 'Talking over', 'heckling', or otherwise disrupting speakers. -- Making derogatory comments about someone else's choices, pushing people to do something they do not wish to do, talking about their - choices or personal preferences to others, or pressuring them to do something they don't wish to - physically or through jeering. +- Making derogatory comments about someone else's choices, pushing people to do + something they do not wish to do, talking about their choices or personal + preferences to others, or pressuring them to do something they don't wish to - + physically or through jeering. - Behaviour that intentionally disrupts an event. - Otherwise influencing actions that may cause hostility in the session. ### Influencing Unacceptable Behavior -We will treat influencing or leading such activities the same way we treat the activities themselves, and thus the same consequences apply. -To make someone do something bad is the same thing as if you were to do it yourself, and we will not tolerate it. +We will treat influencing or leading such activities the same way we treat the +activities themselves, and thus the same consequences apply. To make someone do +something bad is the same thing as if you were to do it yourself, and we will +not tolerate it. ### Stalking or Following -Stalking or following in any form (offline or online) is unnacceptable. In addition, you may not take pictures or record video of others -without their express permission or when asked to stop. Any individual may also request for you to delete all footage you have of them, even -if you took it with their prior consent. +Stalking or following in any form (offline or online) is unnacceptable. In +addition, you may not take pictures or record video of others without their +express permission or when asked to stop. Any individual may also request for +you to delete all footage you have of them, even if you took it with their prior +consent. ### Publication of Personal Information -The publication of personally identifying information (commonly known as "[doxxing](https://en.wikipedia.org/wiki/Doxing)") is directly -prohibited. You may not publish information that someone wants to keep private, unless it is necessary to protect vulnerable people from -intentional abuse. Addditionally, you may not deliberately "out" any aspect of a person's identity without their consent, this includes -gender, pronouns, sexual identity, etc. +The publication of personally identifying information (commonly known +as "[doxxing](https://en.wikipedia.org/wiki/Doxing)") is directly prohibited. +You may not publish information that someone wants to keep private, unless it is +necessary to protect vulnerable people from intentional abuse. Addditionally, +you may not deliberately "out" any aspect of a person's identity without their +consent, this includes gender, pronouns, sexual identity, etc. -Unless it pretains to a case of harassment, as outlined here, in which case some personally identifying information may need to be brought -up in private with the appropriate moderation team to help aid our efforts in keeping the community safe. +Unless it pretains to a case of harassment, as outlined here, in which case some +personally identifying information may need to be brought up in private with the +appropriate moderation team to help aid our efforts in keeping the community +safe. ### Deliberate Misuse of Pronouns[\[1\]](#1) or Names -As an inclusive community, we must respect everyone. That means respecting the pronouns or names they wish for us to use. Deliberate -misgendering, misuse of preferred pronouns[\[1\]](#1), or use of 'dead' or rejected names is not to be tolerated. (If someone -*accidentally* uses the incorrect pronouns, gender, or name, politely ask them to use the correct pronouns/gender/name. But if they are to -continue using the incorrect pronouns, gender, or name, then you should escalate and report them to us.) +As an inclusive community, we must respect everyone. That means respecting the +pronouns or names they wish for us to use. Deliberate misgendering, misuse of +preferred pronouns[\[1\]](#1), or use of 'dead' or rejected names is +not to be tolerated. (If someone +*accidentally* uses the incorrect pronouns, gender, or name, politely ask them +to use the correct pronouns/gender/name. But if they are to continue using the +incorrect pronouns, gender, or name, then you should escalate and report them to +us.) ### Not Stopping After Multiple Requests -If someone asks you to stop doing something, then you should stop. Continuing to do it may be considered harassment, and can lead you to be -removed from our community. +If someone asks you to stop doing something, then you should stop. Continuing to +do it may be considered harassment, and can lead you to be removed from our +community. ## Complains We May Ignore -Additionally, Terra prioritizes marginalized people's safety over privileged people's comfort. We reserve the right to ignore complaints -regarding: +Additionally, Terra prioritizes marginalized people's safety over privileged +people's comfort. We reserve the right to ignore complaints regarding: -- Claims of discrimination against non-marginalized or oppressed groups (eg. being 'superphobic', meaning to not support people who are - 'superstraight', which is a dog whistle for transphobic groups, or being 'cisphobic' without large amounts of evidence, etc.), or claims - of discrimination with no evidence. (Basically, don't report 'cisphobia' to us, because it doesn't exist. But if someone is mocking you or - making fun of you for being cis, and it is *really* getting out of hand, then do tell us.) -- Reasonable communication of boundaries, such as "leave me alone," "go away," or "I'm not discussing this with you." (If someone is asking - you to stop, that is not reason for you to report them as harassing you.) -- Communicating in a 'tone' you don't find [congenial](https://www.thefreedictionary.com/congenial). (You may not report someone for - harassment for being 'annoyed with you' or 'talking sternly to you') -- Criticizing or calling out racist, sexist, discriminatory, or otherwise oppressive behavior or assumptions. (You may not say that someone - is harassing you if they are telling you to stop discriminating against someone.) -- Disagreements that do not qualify as harassment. If you have a simple disagreement with someone, and they have not been discriminating to - anyone, in any form, then we will not take action against them. Two people are allowed to disagree on things without it getting toxic. +- Claims of discrimination against non-marginalized or oppressed groups (eg. + being 'superphobic', meaning to not support people who are + 'superstraight', which is a dog whistle for transphobic groups, or being ' + cisphobic' without large amounts of evidence, etc.), or claims of + discrimination with no evidence. (Basically, don't report 'cisphobia' to us, + because it doesn't exist. But if someone is mocking you or making fun of you + for being cis, and it is *really* getting out of hand, then do tell us.) +- Reasonable communication of boundaries, such as "leave me alone," "go away," + or "I'm not discussing this with you." (If someone is asking you to stop, that + is not reason for you to report them as harassing you.) +- Communicating in a 'tone' you don't + find [congenial](https://www.thefreedictionary.com/congenial). (You may not + report someone for harassment for being 'annoyed with you' or 'talking sternly + to you') +- Criticizing or calling out racist, sexist, discriminatory, or otherwise + oppressive behavior or assumptions. (You may not say that someone is harassing + you if they are telling you to stop discriminating against someone.) +- Disagreements that do not qualify as harassment. If you have a simple + disagreement with someone, and they have not been discriminating to anyone, in + any form, then we will not take action against them. Two people are allowed to + disagree on things without it getting toxic. -We may also additionally choose to enact punishment for submitting a complaint in bad-faith or without adequate justification, if we deem -necessary; if you're submitting a complaint just to troll or to annoy people, we may choose to have you banned or removed from the community -spaces. Don't waste our time. +We may also additionally choose to enact punishment for submitting a complaint +in bad-faith or without adequate justification, if we deem necessary; if you're +submitting a complaint just to troll or to annoy people, we may choose to have +you banned or removed from the community spaces. Don't waste our time. -In order to protect volunteers from abuse and burnout, we reserve the right to reject any report we believe to have been made in bad faith -or with misintent. Reports intended to silence legitimate criticism may be deleted without response. +In order to protect volunteers from abuse and burnout, we reserve the right to +reject any report we believe to have been made in bad faith or with misintent. +Reports intended to silence legitimate criticism may be deleted without +response. ## Reporting -Terra has a global moderation team which is currently comprised of the following members: +Terra has a global moderation team which is currently comprised of the following +members: - solonovamax - - discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)* + - + discord: [@solonovamax#6983](https://discord.com/channels/@me/566146322273402881)* - github: [@solonovamax](https://github.com/solonovamax) - - email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com) + - + email: [solonovamax@12oclockpoint.com](mailto:solonovamax@12oclockpoint.com) - dfsek - - discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)* + - + discord: [@dfsek#4208](https://discord.com/channels/@me/378350362236682240)* - github: [@dfsek](https://github.com/dfsek) - email: [dfsek@protonmail.com](mailto:dfsek@protonmail.com) - duplex (duplexsystem) - - discord: [@Duplex#0797](https://discord.com/channels/@me/356822848641171456)* + - + discord: [@Duplex#0797](https://discord.com/channels/@me/356822848641171456)* - github: [@duplexsystem](https://github.com/duplexsystem) - email: [duplexsys@protonmail.com](mailto:duplexsys@protonmail.com) -\* The preferred method of communication is through discord. Although we will still be responsive on the other platforms, we will be more -responsive on discord. +\* The preferred method of communication is through discord. Although we will +still be responsive on the other platforms, we will be more responsive on +discord. These are people you can contact for anything regarding this code of conduct. -If you are being harassed by a member of the Terra community, or by someone in a Terra community space, notice that someone else is being -harassed, or have any other concerns, please contact a moderator of the platform it occurred on, or someone on the global moderation team. -If the person who is harassing you is on the global moderation team, they will [recuse](https://www.thefreedictionary.com/recuse) themselves -from handling your incident. (Meaning: if you are reporting someone on the team, they will not be involved in the discussion.) We will -respond within a reasonable time frame, but generally within about 1 day. +If you are being harassed by a member of the Terra community, or by someone in a +Terra community space, notice that someone else is being harassed, or have any +other concerns, please contact a moderator of the platform it occurred on, or +someone on the global moderation team. If the person who is harassing you is on +the global moderation team, they +will [recuse](https://www.thefreedictionary.com/recuse) themselves from handling +your incident. (Meaning: if you are reporting someone on the team, they will not +be involved in the discussion.) We will respond within a reasonable time frame, +but generally within about 1 day. -This code of conduct applies to Terra community spaces, but if you are being harassed by a member of Terra *outside* our spaces, we still -want to know about it as we may choose to take action within our community. We will take all good-faith reports seriously and will always -attempt to handle them appropriately. This includes harassment outside our spaces and harassment that took place at any point in time. The -moderation team reserves the right to exclude people from Terra communities based on their past behavior, including behavior outside Terra -spaces and behavior towards people who are not in Terra. +This code of conduct applies to Terra community spaces, but if you are being +harassed by a member of Terra *outside* our spaces, we still want to know about +it as we may choose to take action within our community. We will take all +good-faith reports seriously and will always attempt to handle them +appropriately. This includes harassment outside our spaces and harassment that +took place at any point in time. The moderation team reserves the right to +exclude people from Terra communities based on their past behavior, including +behavior outside Terra spaces and behavior towards people who are not in Terra. -Note: although we only have the ability to moderate official community spaces, if you are being harassed by someone in a non-official -community space, and the moderation team of that platform refuses to do anything to help you (or even if they *do* help you), then you -should notify us so that we may take appropriate action. +Note: although we only have the ability to moderate official community spaces, +if you are being harassed by someone in a non-official community space, and the +moderation team of that platform refuses to do anything to help you (or even if +they *do* help you), then you should notify us so that we may take appropriate +action. -We will respect confidentiality requests for the purpose of protecting victims of abuse. At our discretion, we may publicly name a person -which we have received harassment complaints about, or privately warn third parties about them, but only if we believe that doing so will -increase the safety of Terra community members or the general public. We will not name harassment victims or reporters of harassment -(assuming the report was made in good-faith) without their explicit consent; all reports will remain anonymous by default. +We will respect confidentiality requests for the purpose of protecting victims +of abuse. At our discretion, we may publicly name a person which we have +received harassment complaints about, or privately warn third parties about +them, but only if we believe that doing so will increase the safety of Terra +community members or the general public. We will not name harassment victims or +reporters of harassment +(assuming the report was made in good-faith) without their explicit consent; all +reports will remain anonymous by default. ## Consequences of Unacceptable Behavior -Participants asked to stop any harassing behavior are expected to comply immediately. Whether or not you comply immediately, you may still -face consequences for you actions, but if the harasser doesn't comply immediately then we may choose to take additional actions to protect -the Terra community members or the individual being harassed. +Participants asked to stop any harassing behavior are expected to comply +immediately. Whether or not you comply immediately, you may still face +consequences for you actions, but if the harasser doesn't comply immediately +then we may choose to take additional actions to protect the Terra community +members or the individual being harassed. -Violation of this code can result in being asked to leave an event or online space, either temporarily or for the duration of the event, or -being banned from participation in spaces, or future events and activities in perpetuity. If a participant engages in harassing behavior, -the global moderation team may take any action they deem appropriate, up to and including expulsion from all Terra community spaces and -identification of the participant as a harasser to other Terra community members or the general public. Bad behavior from any community +Violation of this code can result in being asked to leave an event or online +space, either temporarily or for the duration of the event, or being banned from +participation in spaces, or future events and activities in perpetuity. If a +participant engages in harassing behavior, the global moderation team may take +any action they deem appropriate, up to and including expulsion from all Terra +community spaces and identification of the participant as a harasser to other +Terra community members or the general public. Bad behavior from any community member, including those with decision-making authority, will not be tolerated. -In addition, any participants who abuse the reporting process will be considered to be in violation of these guidelines and subject to -consequences. False reporting, especially to retaliate or exclude, will not be accepted or tolerated. +In addition, any participants who abuse the reporting process will be considered +to be in violation of these guidelines and subject to consequences. False +reporting, especially to retaliate or exclude, will not be accepted or +tolerated. ## Questions -if you have further questions for anything not addressed here, you may open an issue on this github repo, or contact a member of the global -moderation team. +if you have further questions for anything not addressed here, you may open an +issue on this github repo, or contact a member of the global moderation team. ## License and Attribution This set of guidelines is distributed under a -[Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/). +[Creative Commons Attribution-ShareAlike license](https://creativecommons.org/licenses/by-sa/3.0/) +. These guidelines have been adapted from -[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/), which were adapted -from: +[Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) +, which were adapted from: - Mozilla's original Community Participation Guidelines - The [Ubuntu Code of Conduct](https://ubuntu.com/community/code-of-conduct) -- Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/) -- And the [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) +- -which in turn were based on [Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/), along with some adapted text -from the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and -the [WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/). +Mozilla's [View Source Conference Code of Conduct](https://viewsourceconf.org/berlin-2016/code-of-conduct/) + +- And + the [Rust Language Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) + +which in turn were based +on [Stumptown Syndicate's Citizen Code of Conduct](http://citizencodeofconduct.org/) +, along with some adapted text from +the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and +the [WisCon code of conduct](http://wiscon.net/policies/anti-harassment/code-of-conduct/) +. It was then modified by solonovamax with various inclusions from -the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and a few other sources. +the [LGBTQ in Technology Code of Conduct](https://lgbtq.technology/coc.html) and +a few other sources. ## Notes #### \[1\] -You provide a set of pronouns that everyone is comfortable addressing you with. Although some people are comfortable -using [neopronouns](https://www.mypronouns.org/neopronouns), not everyone is. Therefore, if you use neopronouns, you should have at *least* -one set of more common pronouns (One of he/him, she/her, or they/them; it doesn't matter which one. Anyone who doesn't respect your basic -pronouns will be removed from the community.) that people may use, should they so choose, as some people are not comfortable -using [neopronouns](https://www.mypronouns.org/neopronouns). But if someone refuses to use your more common pronouns, you should report them -to us. Additionally, you may not ask people to use unreasonable pronouns, such as 'acab/acabself', 'that/bitch', 'ur/mom', or -'dream/dreamself' (pronouns related to real people, eg. the minecraft youtuber 'dreamwastaken'). Doing so will be considered mockery of -individuals who use non-standard pronouns and is very disrespectful. \ No newline at end of file +You provide a set of pronouns that everyone is comfortable addressing you with. +Although some people are comfortable +using [neopronouns](https://www.mypronouns.org/neopronouns), not everyone is. +Therefore, if you use neopronouns, you should have at *least* +one set of more common pronouns (One of he/him, she/her, or they/them; it +doesn't matter which one. Anyone who doesn't respect your basic pronouns will be +removed from the community.) that people may use, should they so choose, as some +people are not comfortable +using [neopronouns](https://www.mypronouns.org/neopronouns). But if someone +refuses to use your more common pronouns, you should report them to us. +Additionally, you may not ask people to use unreasonable pronouns, such as ' +acab/acabself', 'that/bitch', 'ur/mom', or +'dream/dreamself' (pronouns related to real people, eg. the minecraft youtuber ' +dreamwastaken'). Doing so will be considered mockery of individuals who use +non-standard pronouns and is very disrespectful. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 743a1face..3c2c62467 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,17 +1,22 @@ # Contributing to Terra -First off, thank you for considering contributing to Terra. It's people like you that make Terra such a great tool. +First off, thank you for considering contributing to Terra. It's people like you +that make Terra such a great tool. -Following these guidelines helps to effectively use the time of the developers managing and developing this open source project, making it -more enjoyable for all of us. +Following these guidelines helps to effectively use the time of the developers +managing and developing this open source project, making it more enjoyable for +all of us. -Terra is an open source project and we love to receive contributions from our community, you! There are many ways to contribute, from -writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be -incorporated into Terra. +Terra is an open source project and we love to receive contributions from our +community, you! There are many ways to contribute, from writing tutorials or +blog posts, improving the documentation, submitting bug reports and feature +requests or writing code which can be incorporated into Terra. -The following is a set of guidelines for contributing to Terra and its packages, which are hosted in -the [PolyhedralDev Organization](https://github.com/PolyhedralDev) on GitHub. These are mostly guidelines, not rules. Use your best -judgment, and feel free to propose changes to this document in a pull request. +The following is a set of guidelines for contributing to Terra and its packages, +which are hosted in +the [PolyhedralDev Organization](https://github.com/PolyhedralDev) on GitHub. +These are mostly guidelines, not rules. Use your best judgment, and feel free to +propose changes to this document in a pull request. #### Table Of Contents @@ -51,8 +56,10 @@ judgment, and feel free to propose changes to this document in a pull request. ## Code of Conduct -This project and everyone participating in it is governed by the [Terra of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected -to uphold this code. Please report unacceptable behavior to [Terra global moderation team](CODE_OF_CONDUCT.md#Reporting). +This project and everyone participating in it is governed by +the [Terra of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected +to uphold this code. Please report unacceptable behavior +to [Terra global moderation team](CODE_OF_CONDUCT.md#Reporting). ## I don't want to read this whole thing I just have a question!!! @@ -66,160 +73,219 @@ We have an official discord server where you can request help from various users ### Your First Contribution -Unsure where to begin contributing to Terra? You can start by looking through "beginner" and "help wanted" issues: +Unsure where to begin contributing to Terra? You can start by looking through " +beginner" and "help wanted" issues: -- [Beginner issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Good%20First%20Issue) - issues which should be friendly to - anyone new to terra. -- [Help wanted issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Help%20Wanted) - issues which should be a bit more involved - than "beginner" issues. +- [Beginner issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Good%20First%20Issue) + - issues which should be friendly to anyone new to terra. +- [Help wanted issues](https://github.com/PolyhedralDev/Terra/labels/Note%3A%20Help%20Wanted) + - issues which should be a bit more involved than "beginner" issues. New to github? Working on your first Pull Request? Check out [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github) to get you up on your feet. -At this point, you're ready to make your changes! Feel free to ask for help; everyone is a beginner at first! +At this point, you're ready to make your changes! Feel free to ask for help; +everyone is a beginner at first! -If a maintainer asks you to "rebase" your PR, they're saying that a lot of code has changed, and that you need to update your branch so it's -easier to merge. +If a maintainer asks you to "rebase" your PR, they're saying that a lot of code +has changed, and that you need to update your branch so it's easier to merge. ### Reporting Bugs -This section guides you through submitting a bug report for Terra. Following these guidelines helps maintainers and the community understand -your report, and spend their time fixing the issue instead of understanding what you mean. +This section guides you through submitting a bug report for Terra. Following +these guidelines helps maintainers and the community understand your report, and +spend their time fixing the issue instead of understanding what you mean. -Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create -one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). +Before creating bug reports, please +check [this list](#before-submitting-a-bug-report) as you might find out that +you don't need to create one. When you are creating a bug report, +please [include as many details as possible](#how-do-i-submit-a-good-bug-report) +. > **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. #### Before Submitting A Bug Report -- Join the [discord server](https://discord.dfsek.com) to help resolve simple issues. -- You must be on the LATEST version of Terra to receive any support. There is no support for older versions of Terra. -- Make sure that this is not a *specific* compatibility issue with another terrain generation mod. Do not request *specific* compatibility - with mods or plugins (e.g. "Compatibility with TechCraft v7"). That should be implemented in an addon, **not** in the main project. - *General* compatibility (e.g. "Ability to pull Vanilla/Modded features from parent biomes") will be considered in the main project. -- Search for any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) open with your problem. If you open - a duplicate, it will be closed as such. -- Make sure that it is actually Terra causing the issue, and not another mod/plugin. You can do this by testing to see if you can recreate - the issue without Terra installed. -- Double check that this is not an issue with a specific Terra *pack* or Terra *addon*, and instead applies to all of Terra. -- Include a copy of the latest.log file. Putting *just* the exception is not enough. We need to be able to check that there wasn't anything - else before that caused it. -- Be sure to fill out all the required information and give descriptions of everything. +- Join the [discord server](https://discord.dfsek.com) to help resolve simple + issues. +- You must be on the LATEST version of Terra to receive any support. There is no + support for older versions of Terra. +- Make sure that this is not a *specific* compatibility issue with another + terrain generation mod. Do not request *specific* compatibility with mods or + plugins (e.g. "Compatibility with TechCraft v7"). That should be implemented + in an addon, **not** in the main project. + *General* compatibility (e.g. "Ability to pull Vanilla/Modded features from + parent biomes") will be considered in the main project. +- Search for + any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) + open with your problem. If you open a duplicate, it will be closed as such. +- Make sure that it is actually Terra causing the issue, and not another + mod/plugin. You can do this by testing to see if you can recreate the issue + without Terra installed. +- Double check that this is not an issue with a specific Terra *pack* or Terra * + addon*, and instead applies to all of Terra. +- Include a copy of the latest.log file. Putting *just* the exception is not + enough. We need to be able to check that there wasn't anything else before + that caused it. +- Be sure to fill out all the required information and give descriptions of + everything. #### How Do I Submit A (Good) Bug Report? Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/) -. [Create an issue](https://github.com/PolyhedralDev/Terra/issues/new) and provide the prerequisite information by filling in the Bug Report -template. +. [Create an issue](https://github.com/PolyhedralDev/Terra/issues/new) and +provide the prerequisite information by filling in the Bug Report template. -Explain the problem and include additional details to help maintainers reproduce the problem: +Explain the problem and include additional details to help maintainers reproduce +the problem: - **Use a clear and descriptive title** for the issue to identify the problem. -- **Describe the exact steps which reproduce the problem** in as many details as possible. When listing steps, **don't just say what you - did, but explain how you did it**. +- **Describe the exact steps which reproduce the problem** in as many details as + possible. When listing steps, **don't just say what you did, but explain how + you did it**. - **Provide specific examples to demonstrate the steps**. -- **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. +- **Describe the behavior you observed after following the steps** and point out + what exactly is the problem with that behavior. - **Explain which behavior you expected to see instead and why.** -- **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more - information using the guidelines below. +- **If the problem wasn't triggered by a specific action**, describe what you + were doing before the problem happened and share more information using the + guidelines below. Include details about your configuration and environment: -- **Which version of Terra are you using?** You can get the exact version by running `/te version`. -- **What's the name and version of the platform you're using**? (eg. Spigot, Fabric, Paper, etc.) +- **Which version of Terra are you using?** You can get the exact version by + running `/te version`. +- **What's the name and version of the platform you're using**? (eg. Spigot, + Fabric, Paper, etc.) - **Which external plugins or mods do you have installed?** -- **Which Terra packs do you have installed?** You can get that list by running `/te packs`. -- **Which Terra addons do you have installed?** You can get that list by running `/te addons`. +- **Which Terra packs do you have installed?** You can get that list by + running `/te packs`. +- **Which Terra addons do you have installed?** You can get that list by + running `/te addons`. ### Suggesting Enhancements -This section guides you through submitting an enhancement suggestion for Terra, including completely new features and minor improvements to -existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related -suggestions. +This section guides you through submitting an enhancement suggestion for Terra, +including completely new features and minor improvements to existing +functionality. Following these guidelines helps maintainers and the community +understand your suggestion and find related suggestions. -Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that -you don't need to create one. When you are creating an enhancement suggestion, -please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). +Before creating enhancement suggestions, please +check [this list](#before-submitting-an-enhancement-suggestion) as you might +find out that you don't need to create one. When you are creating an enhancement +suggestion, +please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion) +. #### Before Submitting An Enhancement Suggestion -- You must be on the **LATEST** version of Terra to make sure your feature hasn't been added yet. -- Search for any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) (Including closed!) with your - problem. If you open a duplicate, it will be closed as such. +- You must be on the **LATEST** version of Terra to make sure your feature + hasn't been added yet. +- Search for + any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) ( + Including closed!) with your problem. If you open a duplicate, it will be + closed as such. - Verify that this is actually within the scope of Terra. -- Be sure that this is not a feature request that should be made for a specific Terra *pack*, and instead applies to all of Terra. -- Be sure that this is not something that should be implemented as a Terra addon, and instead applies to all of Terra. -- Make sure that you attach a copy of the latest.log file, if there are any exceptions thrown in the console. Putting *just* the exception - **is not enough**. We need to be able to check that there wasn't anything else before that caused it. +- Be sure that this is not a feature request that should be made for a specific + Terra *pack*, and instead applies to all of Terra. +- Be sure that this is not something that should be implemented as a Terra + addon, and instead applies to all of Terra. +- Make sure that you attach a copy of the latest.log file, if there are any + exceptions thrown in the console. Putting *just* the exception + **is not enough**. We need to be able to check that there wasn't anything else + before that caused it. #### How Do I Submit A (Good) Enhancement Suggestion? -Enhancement suggestions are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue on our main repository -and provide the following information: +Enhancement suggestions are tracked +as [GitHub issues](https://guides.github.com/features/issues/). Create an issue +on our main repository and provide the following information: -- **Use a clear and descriptive title** for the issue to identify the suggestion. -- **Provide a step-by-step description of the suggested enhancement** in as many details as possible. +- **Use a clear and descriptive title** for the issue to identify the + suggestion. +- **Provide a step-by-step description of the suggested enhancement** in as many + details as possible. - **Provide specific examples to demonstrate the steps**. -- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. -- **Explain why this enhancement would be useful** to most Terra users and isn't something that can or should be implemented as an addon. +- **Describe the current behavior** and **explain which behavior you expected to + see instead** and why. +- **Explain why this enhancement would be useful** to most Terra users and isn't + something that can or should be implemented as an addon. ### Pull Requests This section guides you through submitting a pull request for Terra. -While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete -additional design work, tests, or other changes before your pull request can be ultimately accepted. +While the prerequisites above must be satisfied prior to having your pull +request reviewed, the reviewer(s) may ask you to complete additional design +work, tests, or other changes before your pull request can be ultimately +accepted. #### Before Submitting A Pull Request -- You must be on the **LATEST** version of Terra to make sure your feature hasn't been added yet. -- Search for any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) (Including closed!) with your - problem. If you open a duplicate, it will be closed as such. +- You must be on the **LATEST** version of Terra to make sure your feature + hasn't been added yet. +- Search for + any [already existing issues](https://github.com/PolyhedralDev/Terra/issues?q=is%3Aissue+) ( + Including closed!) with your problem. If you open a duplicate, it will be + closed as such. - Verify that this is actually within the scope of Terra. -- Be sure that this is not a feature request that should be made for a specific Terra *pack*, and instead applies to all of Terra. -- Be sure that this is not something that should be implemented as a Terra addon, and instead applies to all of Terra. -- Make sure that you attach a copy of the latest.log file, if there are any exceptions thrown in the console. Putting *just* the - exception **is not enough**. We need to be able to check that there wasn't anything else before that caused it. +- Be sure that this is not a feature request that should be made for a specific + Terra *pack*, and instead applies to all of Terra. +- Be sure that this is not something that should be implemented as a Terra + addon, and instead applies to all of Terra. +- Make sure that you attach a copy of the latest.log file, if there are any + exceptions thrown in the console. Putting *just* the exception **is not + enough**. We need to be able to check that there wasn't anything else before + that caused it. #### How Do I Submit A (Good) Pull Request? -Pull Requests are tracked as [GitHub Pull Requests](https://guides.github.com/activities/forking/#making-a-pull-request). Create a pr on our -main repository and provide the following information: +Pull Requests are tracked +as [GitHub Pull Requests](https://guides.github.com/activities/forking/#making-a-pull-request) +. Create a pr on our main repository and provide the following information: - **Use a clear and descriptive title** to identify the pull request. - **State what this pull request adds/fixes**. -- **Be sure that you are the owner of the code you contributed** or that it can be licensed under the GPLv3. -- **Provide a description goals and non-goals of the pull request** in as many details as possible. -- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. -- **Explain why this enhancement would be useful** to most Terra users and isn't something that can or should be implemented as an addon. +- **Be sure that you are the owner of the code you contributed** or that it can + be licensed under the GPLv3. +- **Provide a description goals and non-goals of the pull request** in as many + details as possible. +- **Describe the current behavior** and **explain which behavior you expected to + see instead** and why. +- **Explain why this enhancement would be useful** to most Terra users and isn't + something that can or should be implemented as an addon. ## Styleguides ### Git Commits -Following this is not mandatory, but rather a set of guidelines. As long as your commit messages aren't absolutely awful, it's probably -fine. But it would be nice if you followed them. +Following this is not mandatory, but rather a set of guidelines. As long as your +commit messages aren't absolutely awful, it's probably fine. But it would be +nice if you followed them. #### Committing -When you commit code, try to avoid committing large amounts of code in a single go. Splitting up code into smaller commits is much nicer and -makes it easier to trace a feature to a single commit. +When you commit code, try to avoid committing large amounts of code in a single +go. Splitting up code into smaller commits is much nicer and makes it easier to +trace a feature to a single commit. -Try to stick to one feature/fix/etc. per commit. A good rule of thumb is if you need to use the word "and" in the subject line, then it -should probably™ be two commits. +Try to stick to one feature/fix/etc. per commit. A good rule of thumb is if you +need to use the word "and" in the subject line, then it should probably™ be two +commits. #### Git Commit Messages -- Subject line must fit the following format: `: `. Type must be one of the following: +- Subject line must fit the following format: `: `. Type + must be one of the following: - Build: Changes that affect the build system or external dependencies. - Docs: Documentation only changes. - Feat: A new feature. - Fix: A bug fix. - Perf: Performance improvements. - Refactor: Refactoring sections of the codebase. - - Repo: Changes to the repository structure that do not affect code. (Eg. modification of the `README.md` file, etc.) + - Repo: Changes to the repository structure that do not affect code. (Eg. + modification of the `README.md` file, etc.) - Revert: Revert a previous commit. - Style: Code style updates. - Test: Anything related to testing. @@ -266,7 +332,8 @@ should probably™ be two commits. ### Code Styleguide -Use an IDE with support for `.editorconfig` files. There is an included editorconfig file in the base of the project so that your IDE should +Use an IDE with support for `.editorconfig` files. There is an included +editorconfig file in the base of the project so that your IDE should automatically use the correct code style settings. ### Documentation Styleguide @@ -279,41 +346,55 @@ TODO #### General Compatibility -General compatibility (example: injection of Vanilla structures/features/carvers into packs) is acceptable in the main project. +General compatibility (example: injection of Vanilla structures/features/carvers +into packs) is acceptable in the main project. -- General compatibility features should be *disabled by default*. Having things auto-injected causes unpredictable behaviour that is - annoying to diagnose. General-compatibility options should have config values attached which are disabled by default. -- These config options should also be *simple to use*. Think of the people who will be using these compatibility options. They want to flick - a switch and have things be compatible. That means that a majority of compatibility options should stay in `pack.yml`, to make it simple - to go into a pack and turn on specific compatibilities. This does *not* mean that more advanced compatibility options are off the table, - for example, look at Feature compatibility, where features can either be automatically injected, *or* configured individually per Terra - biome, depending on how much control the user wants. +- General compatibility features should be *disabled by default*. Having things + auto-injected causes unpredictable behaviour that is annoying to diagnose. + General-compatibility options should have config values attached which are + disabled by default. +- These config options should also be *simple to use*. Think of the people who + will be using these compatibility options. They want to flick a switch and + have things be compatible. That means that a majority of compatibility options + should stay in `pack.yml`, to make it simple to go into a pack and turn on + specific compatibilities. This does *not* mean that more advanced + compatibility options are off the table, for example, look at Feature + compatibility, where features can either be automatically injected, *or* + configured individually per Terra biome, depending on how much control the + user wants. #### Specific Compatibility -Specific compatibility should *not* be put in the main project. (Example: Adding the ability to generate TechCraft v7's doo-dads with a -TerraScript function) +Specific compatibility should *not* be put in the main project. (Example: Adding +the ability to generate TechCraft v7's doo-dads with a TerraScript function) -Having specific compatibilities leads to tons of extra dependencies to keep track of, as well as adding lots of additional stuff to -maintain. It quickly becomes a mess. Especially when most users will never need to use this feature. +Having specific compatibilities leads to tons of extra dependencies to keep +track of, as well as adding lots of additional stuff to maintain. It quickly +becomes a mess. Especially when most users will never need to use this feature. -We have designed an addon API for exactly this purpose. **Specific compatibilities are welcome and encouraged, in the form of addons.** +We have designed an addon API for exactly this purpose. **Specific +compatibilities are welcome and encouraged, in the form of addons.** ### Platform-Agnostic Design -Terra must, at all times, remain platform agnostic. This means it must be able to run on theoretically any voxel based platform. Including -non-minecraft games like Terasology. +Terra must, at all times, remain platform agnostic. This means it must be able +to run on theoretically any voxel based platform. Including non-minecraft games +like Terasology. -When adding a new feature to `common`, make no assumptions about what platform it'll be running on. +When adding a new feature to `common`, make no assumptions about what platform +it'll be running on. Examples: - Don't assume the world height is 256. -- Don't assume that a specific block, item, or entity exists. (Eg. don't assume there exists a block called `minecraft:grass_block`) +- Don't assume that a specific block, item, or entity exists. (Eg. don't assume + there exists a block called `minecraft:grass_block`) ### Data-Driven -When adding a new feature, make it abstract. Don't make assumptions about "specific use cases." If you can only think of a few use cases, -your idea should probably be generalized. +When adding a new feature, make it abstract. Don't make assumptions about " +specific use cases." If you can only think of a few use cases, your idea should +probably be generalized. -You must use configs effectively. Make configs that are *powerful* but also *make sense* and are \[easy\] to use. \ No newline at end of file +You must use configs effectively. Make configs that are *powerful* but also * +make sense* and are \[easy\] to use. \ No newline at end of file diff --git a/README.md b/README.md index a33baa859..08962c148 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,23 @@ # Terra -Terra is an incredibly powerful free & open-source data-driven, platform-agnostic world generator. It allows you to create a world exactly -to your specifications, with no knowledge of Java required. +Terra is an incredibly powerful free & open-source data-driven, +platform-agnostic world generator. It allows you to create a world exactly to +your specifications, with no knowledge of Java required. ## Downloads: -* Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/) -* Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) -* Forge **(ALPHA - NOT PRODUCTION-READY)**: [Modrinth](https://modrinth.com/mod/terra) +* Paper+ servers (Paper, Tuinity, Purpur, + etc): [SpigotMC](https://www.spigotmc.org/resources/85151/) +* Fabric: [Modrinth](https://modrinth.com/mod/terra) + / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) +* Forge **(ALPHA - NOT + PRODUCTION-READY)**: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) ## Building and Running Terra -To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will build all platforms, and produce JARs -in `platforms//build/libs` +To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This +will build all platforms, and produce JARs in `platforms//build/libs` ### Production JARs: @@ -32,10 +36,14 @@ JARs are produced in `platforms//build/libs`. To run Minecraft with Terra in the IDE (for testing) use the following tasks: * Bukkit - * `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test server. (Only needs to be run once). - * `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) test server. (Only needs to be run once). - * `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously). - * `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously). + * `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test + server. (Only needs to be run once). + * `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) + test server. (Only needs to be run once). + * `runPaper` - Run the Paper test server with Terra (`installPaper` must + have been run previously). + * `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must + have been run previously). * Fabric * `runClient` - Run a Minecraft Fabric client with Terra installed. * `runServer` - Run a Minecraft Fabric server with Terra installed. @@ -45,9 +53,12 @@ To run Minecraft with Terra in the IDE (for testing) use the following tasks: ## Contributing -Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and submit a PR! -Join the discord [here](https://discord.gg/PXUEbbF) if you would like to talk more about the project! +Contributions are welcome! If you want to see a feature in Terra, please, open +an issue, or implement it yourself and submit a PR! +Join the discord [here](https://discord.gg/PXUEbbF) if you would like to talk +more about the project! ## Beta -Terra is still in beta! While it is stable, it is not feature-complete. There is a lot to be added! +Terra is still in beta! While it is stable, it is not feature-complete. There is +a lot to be added! diff --git a/build.gradle.kts b/build.gradle.kts index 414f3eb38..7d603aff7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,28 +1,32 @@ -import com.dfsek.terra.* +import com.dfsek.terra.configureCompilation +import com.dfsek.terra.configureDependencies +import com.dfsek.terra.configureDistribution +import com.dfsek.terra.configurePublishing +import com.dfsek.terra.getGitHash val versionObj = Version("6", "0", "0", true) allprojects { version = versionObj group = "com.dfsek.terra" - + configureDependencies() configureCompilation() configurePublishing() - + tasks.withType().configureEach { options.isFork = true options.isIncremental = true } - + tasks.withType().configureEach { useJUnitPlatform() - + maxHeapSize = "2G" ignoreFailures = false failFast = true maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1 - + reports.html.required.set(false) reports.junitXml.required.set(false) } @@ -39,7 +43,7 @@ afterEvaluate { */ @Suppress("MemberVisibilityCanBePrivate") class Version(val major: String, val minor: String, val revision: String, val preRelease: Boolean = false) { - + override fun toString(): String { return if (!preRelease) "$major.$minor.$revision" diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/AddonConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/AddonConfig.kt index 71c6f587e..9602b51f3 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/AddonConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/AddonConfig.kt @@ -1,10 +1,10 @@ package com.dfsek.terra +import java.io.File +import java.util.function.Predicate import org.gradle.api.Project import org.gradle.api.Task import org.gradle.jvm.tasks.Jar -import java.io.File -import java.util.function.Predicate import kotlin.streams.asStream @@ -22,13 +22,13 @@ fun Project.addonDir(dir: File, task: Task) { } project(":common:addons").subprojects.forEach { addonProject -> val jar = (addonProject.tasks.named("jar").get() as Jar) - + val target = File(dir, jar.archiveFileName.get()) - + val base = "${jar.archiveBaseName.get()}-${project.version}" - + println("Copying addon ${jar.archiveFileName.get()} to ${target.absolutePath}. Base name: $base") - + jar.archiveFile.orNull?.asFile?.copyTo(target) } } diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt index d252ecae7..5fe68f42d 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt @@ -1,7 +1,7 @@ package com.dfsek.terra -import org.gradle.api.Project import java.io.ByteArrayOutputStream +import org.gradle.api.Project fun Project.getGitHash(): String { val stdout = ByteArrayOutputStream() diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt index 4872a5543..e38e85ee3 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt @@ -6,7 +6,12 @@ import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.javadoc.Javadoc -import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.filter +import org.gradle.kotlin.dsl.getByName +import org.gradle.kotlin.dsl.register +import org.gradle.kotlin.dsl.withType import org.gradle.language.jvm.tasks.ProcessResources fun Project.configureCompilation() { @@ -14,46 +19,46 @@ fun Project.configureCompilation() { apply(plugin = "java") apply(plugin = "java-library") apply(plugin = "idea") - + configure { sourceCompatibility = JavaVersion.VERSION_16 targetCompatibility = JavaVersion.VERSION_16 } - + tasks.withType { options.encoding = "UTF-8" doFirst { options.compilerArgs.add("-Xlint:all") } } - + tasks.withType { include("**/*.*") filter( - "tokens" to mapOf( - "VERSION" to project.version.toString(), - "DESCRIPTION" to project.properties["terra.description"], - "WIKI" to project.properties["terra.wiki"], - "SOURCE" to project.properties["terra.source"], - "ISSUES" to project.properties["terra.issues"], - "LICENSE" to project.properties["terra.license"] - ) - ) + "tokens" to mapOf( + "VERSION" to project.version.toString(), + "DESCRIPTION" to project.properties["terra.description"], + "WIKI" to project.properties["terra.wiki"], + "SOURCE" to project.properties["terra.source"], + "ISSUES" to project.properties["terra.issues"], + "LICENSE" to project.properties["terra.license"] + ) + ) } - + tasks.withType { options.encoding = "UTF-8" } - + tasks.withType { archiveBaseName.set("Terra-${archiveBaseName.get()}") from("../LICENSE", "../../LICENSE") } - + tasks.register("sourcesJar") { archiveClassifier.set("sources") } - + tasks.register("javadocJar") { dependsOn("javadoc") archiveClassifier.set("javadoc") diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt index 5dbb19755..c659676e6 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -1,12 +1,16 @@ package com.dfsek.terra import org.gradle.api.Project -import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.invoke +import org.gradle.kotlin.dsl.project +import org.gradle.kotlin.dsl.repositories fun Project.configureDependencies() { apply(plugin = "java") apply(plugin = "java-library") - + configurations { val shaded = create("shaded") val shadedApi = create("shadedApi") @@ -16,7 +20,7 @@ fun Project.configureDependencies() { shaded.extendsFrom(shadedImplementation) getByName("implementation").extendsFrom(shadedImplementation) } - + repositories { maven { url = uri("https://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } @@ -25,16 +29,16 @@ fun Project.configureDependencies() { gradlePluginPortal() mavenCentral() } - + dependencies { "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0") "testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0") "compileOnly"("org.jetbrains:annotations:20.1.0") - + "compileOnly"("com.google.guava:guava:30.0-jre") "testImplementation"("com.google.guava:guava:30.0-jre") } - + if (project(":common:addons").subprojects.contains(this)) { // If this is an addon project, depend on the API. dependencies { "compileOnly"(project(":common:api")) diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt index 2bd60d666..b527de9a3 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt @@ -1,6 +1,13 @@ package com.dfsek.terra import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.FileWriter +import java.net.URL +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.plugins.BasePluginExtension @@ -11,29 +18,22 @@ import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.named import org.yaml.snakeyaml.DumperOptions import org.yaml.snakeyaml.Yaml -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream -import java.io.FileWriter -import java.net.URL -import java.util.zip.ZipEntry -import java.util.zip.ZipOutputStream fun Project.configureDistribution() { apply(plugin = "com.github.johnrengelman.shadow") - + val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { group = "terra" doFirst { file("${buildDir}/resources/main/packs/").deleteRecursively() - + val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/default.zip") downloadPack(defaultPackUrl, project) val netherPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/nether.zip") downloadPack(netherPackUrl, project) } } - + val installAddons = tasks.create("installAddons") { group = "terra" project(":common:addons").subprojects.forEach { @@ -41,7 +41,7 @@ fun Project.configureDistribution() { dependsOn(it.tasks.getByName("build")) // Depend on addon JARs } } - + doFirst { // The addons are copied into a JAR because of a ShadowJar bug // which expands *all* JARs, even resource ones, into the fat JAR. @@ -52,13 +52,13 @@ fun Project.configureDistribution() { // https://github.com/johnrengelman/shadow/issues/111 val dest = File(buildDir, "/resources/main/addons.jar") dest.parentFile.mkdirs() - + val zip = ZipOutputStream(FileOutputStream(dest)) - + project(":common:addons").subprojects.forEach { addonProject -> val jar = (addonProject.tasks.named("jar").get() as Jar) println("Packaging addon ${jar.archiveFileName.get()} to ${dest.absolutePath}.") - + val entry = ZipEntry("addons/${jar.archiveFileName.get()}") zip.putNextEntry(entry) FileInputStream(jar.archiveFile.get().asFile).copyTo(zip) @@ -67,7 +67,7 @@ fun Project.configureDistribution() { zip.close() } } - + val generateResourceManifest = tasks.create("generateResourceManifest") { group = "terra" dependsOn(downloadDefaultPacks) @@ -75,24 +75,24 @@ fun Project.configureDistribution() { doFirst { val resources = HashMap>() val packsDir = File("${project.buildDir}/resources/main/packs/") - + packsDir.walkTopDown().forEach { if (it.isDirectory || !it.name.endsWith(".zip")) return@forEach resources.computeIfAbsent("packs") { ArrayList() }.add(it.name) } - + val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/") - + langDir.walkTopDown().forEach { if (it.isDirectory || !it.name.endsWith(".yml")) return@forEach resources.computeIfAbsent("lang") { ArrayList() }.add(it.name) } - + project(":common:addons").subprojects.forEach { addonProject -> val jar = (addonProject.tasks.named("jar").get() as Jar).archiveFileName.get() resources.computeIfAbsent("addons") { ArrayList() }.add(jar) } - + val options = DumperOptions() options.indent = 2 options.indentWithIndicator = true @@ -100,25 +100,25 @@ fun Project.configureDistribution() { options.isPrettyFlow = true options.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK options.defaultScalarStyle = DumperOptions.ScalarStyle.DOUBLE_QUOTED - + val yaml = Yaml(options) - + val manifest = File("${project.buildDir}/resources/main/resources.yml") - + if (manifest.exists()) manifest.delete() manifest.createNewFile() yaml.dump(resources, FileWriter(manifest)) } } - + tasks["processResources"].dependsOn(generateResourceManifest) - + tasks.named("shadowJar") { // Tell shadow to download the packs dependsOn(downloadDefaultPacks) - + configurations = listOf(project.configurations["shaded"]) - + archiveClassifier.set("shaded") setVersion(project.version) relocate("org.apache.commons", "com.dfsek.terra.lib.commons") @@ -126,11 +126,11 @@ fun Project.configureDistribution() { relocate("org.json", "com.dfsek.terra.lib.json") relocate("org.yaml", "com.dfsek.terra.lib.yaml") } - + configure { archivesName.set(project.name) } - + tasks.named("build") { dependsOn(tasks["shadowJar"]) } diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/PublishingConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/PublishingConfig.kt index 7742a85bb..2fa6a3a3b 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/PublishingConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/PublishingConfig.kt @@ -3,7 +3,11 @@ package com.dfsek.terra import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication -import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.maven +import org.gradle.kotlin.dsl.provideDelegate fun Project.configurePublishing() { configure { @@ -13,11 +17,11 @@ fun Project.configurePublishing() { artifact(tasks["jar"]) } } - + repositories { val mavenUrl = "https://repo.codemc.io/repository/maven-releases/" //val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/" - + maven(mavenUrl) { val mavenUsername: String? by project val mavenPassword: String? by project diff --git a/common/addons/README.md b/common/addons/README.md index cea224814..1ee000423 100644 --- a/common/addons/README.md +++ b/common/addons/README.md @@ -1,3 +1,4 @@ # Core Addons -This directory contains the modularized "core addons" that implement Terra's default behavior. \ No newline at end of file +This directory contains the modularized "core addons" that implement Terra's +default behavior. \ No newline at end of file diff --git a/common/addons/api-features/README.md b/common/addons/api-features/README.md index e570ff02c..7c8ba1834 100644 --- a/common/addons/api-features/README.md +++ b/common/addons/api-features/README.md @@ -1,8 +1,10 @@ # api-features + Contains the API for feature generation. This API implemented in: - * `config-feature` - * `generation-stage-feature` - * `config-locators` - * `config-distributors` \ No newline at end of file + +* `config-feature` +* `generation-stage-feature` +* `config-locators` +* `config-distributors` \ No newline at end of file diff --git a/common/addons/biome-provider-image/README.md b/common/addons/biome-provider-image/README.md index f659e1bb1..49e9b8fdb 100644 --- a/common/addons/biome-provider-image/README.md +++ b/common/addons/biome-provider-image/README.md @@ -1,6 +1,6 @@ # biome-provider-image -Implements and registers the `IMAGE` biome provider, a biome provider which generates -biomes from an image, using the `color` attribute of biomes. +Implements and registers the `IMAGE` biome provider, a biome provider which +generates biomes from an image, using the `color` attribute of biomes. This addon registers the provider type, and all associated config options. \ No newline at end of file diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java index 5f609e206..3ba0cb9ba 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -1,57 +1,64 @@ package com.dfsek.terra.addons.biome.image; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import net.jafama.FastMath; -import java.awt.*; +import java.awt.Color; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import java.util.Set; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + public class ImageBiomeProvider implements BiomeProvider { private final Map colorBiomeMap = new HashMap<>(); private final BufferedImage image; private final int resolution; private final Align align; - + public ImageBiomeProvider(Set registry, BufferedImage image, int resolution, Align align) { this.image = image; this.resolution = resolution; this.align = align; registry.forEach(biome -> colorBiomeMap.put(new Color(biome.getColor()), biome)); } - + private static int distance(Color a, Color b) { return FastMath.abs(a.getRed() - b.getRed()) + FastMath.abs(a.getGreen() - b.getGreen()) + FastMath.abs(a.getBlue() - b.getBlue()); } - + @Override public TerraBiome getBiome(int x, int z, long seed) { x /= resolution; z /= resolution; Color color = align.getColor(image, x, z); - return colorBiomeMap.get(colorBiomeMap.keySet().stream().reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new), (running, element) -> { - int d1 = distance(color, running); - int d2 = distance(color, element); - return d1 < d2 ? running : element; - })); + return colorBiomeMap.get(colorBiomeMap.keySet() + .stream() + .reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new), + (running, element) -> { + int d1 = distance(color, running); + int d2 = distance(color, element); + return d1 < d2 ? running : element; + })); } - + public enum Align { CENTER { @Override public Color getColor(BufferedImage image, int x, int z) { - return new Color(image.getRGB(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()), FastMath.floorMod(z - image.getHeight() / 2, image.getHeight()))); + return new Color(image.getRGB(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()), + FastMath.floorMod(z - image.getHeight() / 2, image.getHeight()))); } - }, NONE { + }, + NONE { @Override public Color getColor(BufferedImage image, int x, int z) { return new Color(image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight()))); } }; - + public abstract Color getColor(BufferedImage image, int x, int z); } } diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java index 566abff80..94c0b8984 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java @@ -1,6 +1,9 @@ package com.dfsek.terra.addons.biome.image; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.annotations.Addon; @@ -14,26 +17,27 @@ import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import java.util.function.Supplier; @Addon("biome-provider-image") @Author("Terra") @Version("1.0.0") public class ImageBiomeProviderAddon extends TerraAddon { - public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {}; - + public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { + }; + @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry(PROVIDER_REGISTRY_KEY); - providerRegistry.register("IMAGE", () -> new ImageProviderTemplate(event.getPack().getRegistry(TerraBiome.class))); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( + PROVIDER_REGISTRY_KEY); + providerRegistry.register("IMAGE", () -> new ImageProviderTemplate(event.getPack().getRegistry(TerraBiome.class))); + }) + .failThrough(); } } diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java index 70ad46589..877697c9e 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageProviderTemplate.java @@ -3,29 +3,29 @@ package com.dfsek.terra.addons.biome.image; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import java.awt.image.BufferedImage; import java.util.HashSet; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + public class ImageProviderTemplate implements ObjectTemplate { private final Registry biomes; - @Value("image.name") - private BufferedImage image; - - @Value("image.align") - private ImageBiomeProvider.Align align; - @Value("resolution") @Default - private int resolution = 1; - + private final int resolution = 1; + @Value("image.name") + private BufferedImage image; + @Value("image.align") + private ImageBiomeProvider.Align align; + public ImageProviderTemplate(Registry set) { this.biomes = set; } - + @Override public BiomeProvider get() { return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align); diff --git a/common/addons/biome-provider-pipeline/README.md b/common/addons/biome-provider-pipeline/README.md index 0326bcf6e..9e55109a7 100644 --- a/common/addons/biome-provider-pipeline/README.md +++ b/common/addons/biome-provider-pipeline/README.md @@ -3,5 +3,5 @@ Implements the Biome Pipeline, a procedural biome provider that uses a series of "stages" to apply "mutations" to a 2D grid of biomes. - -This addon registers the `PIPELINE` biome provider type, and all associated configurations. \ No newline at end of file +This addon registers the `PIPELINE` biome provider type, and all associated +configurations. \ No newline at end of file diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java index 3044cd1b9..ac1fa6be5 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomeHolderImpl.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.biome.pipeline; import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; +import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; + public class BiomeHolderImpl implements BiomeHolder { private final Vector2 origin; private final int width; private final int offset; private TerraBiome[][] biomes; - + public BiomeHolderImpl(int width, Vector2 origin) { width += 4; this.width = width; @@ -20,35 +21,38 @@ public class BiomeHolderImpl implements BiomeHolder { this.origin = origin; this.offset = 2; } - + private BiomeHolderImpl(TerraBiome[][] biomes, Vector2 origin, int width, int offset) { this.biomes = biomes; this.origin = origin; this.width = width; this.offset = 2 * offset; } - + @Override public BiomeHolder expand(BiomeExpander expander, long seed) { TerraBiome[][] old = biomes; int newWidth = width * 2 - 1; - + biomes = new TerraBiome[newWidth][newWidth]; - + for(int x = 0; x < width; x++) { for(int z = 0; z < width; z++) { biomes[x * 2][z * 2] = old[x][z]; if(z != width - 1) - biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], old[x][z + 1]); + biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], + old[x][z + 1]); if(x != width - 1) - biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), seed, old[x][z], old[x + 1][z]); + biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), seed, old[x][z], + old[x + 1][z]); if(x != width - 1 && z != width - 1) - biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]); + biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], + old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]); } } return new BiomeHolderImpl(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset); } - + @Override public void mutate(BiomeMutator mutator, long seed) { for(int x = 0; x < width; x++) { @@ -58,7 +62,7 @@ public class BiomeHolderImpl implements BiomeHolder { } } } - + @Override public void fill(BiomeSource source, long seed) { for(int x = 0; x < width; x++) { @@ -67,14 +71,14 @@ public class BiomeHolderImpl implements BiomeHolder { } } } - + @Override public TerraBiome getBiome(int x, int z) { x += offset; z += offset; return getBiomeRaw(x, z); } - + @Override public TerraBiome getBiomeRaw(int x, int z) { if(x >= width || z >= width || x < 0 || z < 0) return null; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java index d5266bb15..122767773 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipeline.java @@ -1,31 +1,33 @@ package com.dfsek.terra.addons.biome.pipeline; -import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; -import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.api.vector.Vector2; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; - import java.util.ArrayList; import java.util.List; +import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; +import com.dfsek.terra.api.vector.Vector2; + + public class BiomePipeline { private final BiomeSource source; private final List stages; private final int size; private final int init; - + private BiomePipeline(BiomeSource source, List stages, int size, int init) { this.source = source; this.stages = stages; this.size = size; this.init = init; } - + /** * Get biomes in a chunk * * @param x Chunk X coord * @param z Chunk Z coord + * * @return BiomeHolder containing biomes. */ public BiomeHolder getBiomes(int x, int z, long seed) { @@ -34,29 +36,29 @@ public class BiomePipeline { for(Stage stage : stages) holder = stage.apply(holder, seed); return holder; } - + public int getSize() { return size; } - + public static final class BiomePipelineBuilder { private final int init; List stages = new ArrayList<>(); private int expand; - + public BiomePipelineBuilder(int init) { this.init = init; expand = init; } - + public BiomePipeline build(BiomeSource source) { for(Stage stage : stages) { if(stage.isExpansion()) expand = expand * 2 - 1; } - + return new BiomePipeline(source, stages, expand, init); } - + public BiomePipelineBuilder addStage(Stage stage) { stages.add(stage); return this; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java index 539723a67..b7ecae266 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java @@ -1,9 +1,11 @@ package com.dfsek.terra.addons.biome.pipeline; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate; -import com.dfsek.terra.addons.biome.pipeline.config.BiomeProviderLoader; import com.dfsek.terra.addons.biome.pipeline.config.NoiseSourceTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate; @@ -11,6 +13,7 @@ import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorT import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate; +import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.annotations.Addon; @@ -22,44 +25,47 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; -import java.util.function.Supplier; @Addon("biome-provider-pipeline") @Author("Terra") @Version("1.0.0") public class BiomePipelineAddon extends TerraAddon { - - public static final TypeKey>> SOURCE_REGISTRY_KEY = new TypeKey<>() {}; - - public static final TypeKey>> STAGE_REGISTRY_KEY = new TypeKey<>() {}; - public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {}; + + public static final TypeKey>> SOURCE_REGISTRY_KEY = new TypeKey<>() { + }; + + public static final TypeKey>> STAGE_REGISTRY_KEY = new TypeKey<>() { + }; + public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { + }; @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry(PROVIDER_REGISTRY_KEY); - providerRegistry.register("PIPELINE", () -> new BiomePipelineTemplate(main)); - }) - .then(event -> { - CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry(SOURCE_REGISTRY_KEY); - sourceRegistry.register("NOISE", NoiseSourceTemplate::new); - }) - .then(event -> { - CheckedRegistry>> stageRegistry = event.getPack().getOrCreateRegistry(STAGE_REGISTRY_KEY); - stageRegistry.register("FRACTAL_EXPAND", ExpanderStageTemplate::new); - stageRegistry.register("SMOOTH", SmoothMutatorTemplate::new); - stageRegistry.register("REPLACE", ReplaceMutatorTemplate::new); - stageRegistry.register("REPLACE_LIST", ReplaceListMutatorTemplate::new); - stageRegistry.register("BORDER", BorderMutatorTemplate::new); - stageRegistry.register("BORDER_LIST", BorderListMutatorTemplate::new); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( + PROVIDER_REGISTRY_KEY); + providerRegistry.register("PIPELINE", () -> new BiomePipelineTemplate(main)); + }) + .then(event -> { + CheckedRegistry>> sourceRegistry = event.getPack().getOrCreateRegistry( + SOURCE_REGISTRY_KEY); + sourceRegistry.register("NOISE", NoiseSourceTemplate::new); + }) + .then(event -> { + CheckedRegistry>> stageRegistry = event.getPack().getOrCreateRegistry(STAGE_REGISTRY_KEY); + stageRegistry.register("FRACTAL_EXPAND", ExpanderStageTemplate::new); + stageRegistry.register("SMOOTH", SmoothMutatorTemplate::new); + stageRegistry.register("REPLACE", ReplaceMutatorTemplate::new); + stageRegistry.register("REPLACE_LIST", ReplaceListMutatorTemplate::new); + stageRegistry.register("BORDER", BorderMutatorTemplate::new); + stageRegistry.register("BORDER_LIST", BorderListMutatorTemplate::new); + }) + .failThrough(); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java index 21aa51e6e..542603188 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java @@ -1,15 +1,17 @@ package com.dfsek.terra.addons.biome.pipeline; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import net.jafama.FastMath; -import org.jetbrains.annotations.NotNull; + public class BiomePipelineProvider implements BiomeProvider { private final LoadingCache holderCache; @@ -17,50 +19,51 @@ public class BiomePipelineProvider implements BiomeProvider { private final int resolution; private final NoiseSampler mutator; private final double noiseAmp; - + public BiomePipelineProvider(BiomePipeline pipeline, TerraPlugin main, int resolution, NoiseSampler mutator, double noiseAmp) { this.resolution = resolution; this.mutator = mutator; this.noiseAmp = noiseAmp; holderCache = CacheBuilder.newBuilder() - .maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache()) - .build( - new CacheLoader() { - @Override - public BiomeHolder load(@NotNull SeededVector key) { - return pipeline.getBiomes(key.x, key.z, key.seed); - } - } - ); + .maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache()) + .build( + new CacheLoader() { + @Override + public BiomeHolder load(@NotNull SeededVector key) { + return pipeline.getBiomes(key.x, key.z, key.seed); + } + } + ); this.pipeline = pipeline; } - + @Override public TerraBiome getBiome(int x, int z, long seed) { x += mutator.getNoiseSeeded(seed + 1, x, z) * noiseAmp; z += mutator.getNoiseSeeded(seed + 2, x, z) * noiseAmp; - - + + x = FastMath.floorToInt(FastMath.floorDiv(x, resolution)); - + z = FastMath.floorToInt(FastMath.floorDiv(z, resolution)); - + int fdX = FastMath.floorDiv(x, pipeline.getSize()); int fdZ = FastMath.floorDiv(z, pipeline.getSize()); - return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize()); + return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), + z - fdZ * pipeline.getSize()); } - + private static final class SeededVector { private final int x; private final int z; private final long seed; - + private SeededVector(int x, int z, long seed) { this.x = x; this.z = z; this.seed = seed; } - + @Override public int hashCode() { int result = 0; @@ -69,12 +72,12 @@ public class BiomePipelineProvider implements BiomeProvider { result = 31 * result + z; return result; } - + @Override public boolean equals(Object obj) { if(!(obj instanceof SeededVector)) return false; SeededVector that = (SeededVector) obj; - + return this.seed == that.seed && this.x == that.x && this.z == that.z; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java index 39bc22f73..462f8ebec 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java @@ -2,6 +2,7 @@ package com.dfsek.terra.addons.biome.pipeline.api; import com.dfsek.terra.api.world.biome.TerraBiome; + public interface BiomeExpander { TerraBiome getBetween(double x, double z, long seed, TerraBiome... others); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java index 1d57ba616..bf88c46e2 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java @@ -1,16 +1,17 @@ package com.dfsek.terra.addons.biome.pipeline.api; -import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; +import com.dfsek.terra.api.world.biome.TerraBiome; + public interface BiomeHolder { BiomeHolder expand(BiomeExpander expander, long seed); - + void mutate(BiomeMutator mutator, long seed); - + void fill(BiomeSource source, long seed); - + TerraBiome getBiome(int x, int z); - + TerraBiome getBiomeRaw(int x, int z); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java index 547409b5a..fab417815 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java @@ -2,21 +2,22 @@ package com.dfsek.terra.addons.biome.pipeline.api; import com.dfsek.terra.api.world.biome.TerraBiome; + public interface BiomeMutator { TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed); - + class ViewPoint { private final BiomeHolder biomes; private final int offX; private final int offZ; - + public ViewPoint(BiomeHolder biomes, int offX, int offZ) { this.biomes = biomes; this.offX = offX; this.offZ = offZ; } - - + + public TerraBiome getBiome(int x, int z) { return biomes.getBiomeRaw(x + offX, z + offZ); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java index dbf9f2722..af00308c3 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java @@ -1,8 +1,8 @@ package com.dfsek.terra.addons.biome.pipeline.api; public interface Stage { - boolean isExpansion(); - BiomeHolder apply(BiomeHolder in, long seed); - + + boolean isExpansion(); + } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java index bc35d9a01..11bc53417 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomePipelineTemplate.java @@ -2,33 +2,35 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.BiomePipeline; -import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider; -import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; import java.util.List; -@SuppressWarnings({"FieldMayBeFinal", "unused"}) +import com.dfsek.terra.addons.biome.pipeline.BiomePipeline; +import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider; +import com.dfsek.terra.addons.biome.pipeline.api.Stage; +import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + + +@SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class BiomePipelineTemplate extends BiomeProviderTemplate { private final TerraPlugin main; @Value("pipeline.initial-size") @Default private @Meta int initialSize = 2; - + @Value("pipeline.stages") private @Meta List<@Meta Stage> stages; - + @Value("pipeline.source") private @Meta BiomeSource source; - + public BiomePipelineTemplate(TerraPlugin main) { this.main = main; } - + @Override public BiomeProvider get() { BiomePipeline.BiomePipelineBuilder biomePipelineBuilder = new BiomePipeline.BiomePipelineBuilder(initialSize); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java index 2d181efe7..a254082ca 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderLoader.java @@ -3,10 +3,12 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; + +import java.lang.reflect.AnnotatedType; + import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import java.lang.reflect.AnnotatedType; public class BiomeProviderLoader implements TypeLoader { @Override diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java index fc8909455..c1aa496cb 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/BiomeProviderTemplate.java @@ -3,10 +3,12 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + public abstract class BiomeProviderTemplate implements ObjectTemplate { @Value("resolution") @Default diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java index 042253fe6..627146800 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/NoiseSourceTemplate.java @@ -1,20 +1,22 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.annotations.Value; + +import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; import com.dfsek.terra.addons.biome.pipeline.source.NoiseSource; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; + public class NoiseSourceTemplate extends SourceTemplate { @Value("noise") private @Meta NoiseSampler noise; - + @Value("biomes") private @Meta ProbabilityCollection<@Meta TerraBiome> biomes; - + @Override public BiomeSource get() { return new NoiseSource(biomes, noise); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java index c9a41e949..831ca3d88 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/SourceTemplate.java @@ -1,8 +1,10 @@ package com.dfsek.terra.addons.biome.pipeline.config; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; -public abstract class SourceTemplate implements ObjectTemplate{ + +public abstract class SourceTemplate implements ObjectTemplate { } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java index 4aba4990f..4b491e482 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/StageTemplate.java @@ -2,12 +2,12 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; + import com.dfsek.terra.addons.biome.pipeline.api.Stage; -import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + public abstract class StageTemplate implements ObjectTemplate { @Value("noise") protected @Meta NoiseSampler noise; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java index 6ccf0e9af..ea74a303a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/expander/ExpanderStageTemplate.java @@ -5,6 +5,7 @@ import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.expand.FractalExpander; import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage; + public class ExpanderStageTemplate extends StageTemplate { @Override public Stage get() { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java index a65e181d6..136243bc2 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderListMutatorTemplate.java @@ -1,6 +1,9 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.annotations.Value; + +import java.util.Map; + import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator; @@ -9,23 +12,22 @@ import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Map; @SuppressWarnings("unused") public class BorderListMutatorTemplate extends StageTemplate { @Value("from") private @Meta String from; - + @Value("default-replace") private @Meta String defaultReplace; - + @Value("default-to") private @Meta ProbabilityCollection<@Meta TerraBiome> defaultTo; - + @Value("replace") private @Meta Map<@Meta TerraBiome, @Meta ProbabilityCollection<@Meta TerraBiome>> replace; - - + + @Override public Stage get() { return new MutatorStage(new BorderListMutator(replace, from, defaultReplace, noise, defaultTo)); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java index 786b54dc8..6632bf6bb 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/BorderMutatorTemplate.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; + import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator; @@ -10,17 +10,18 @@ import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; + @SuppressWarnings("unused") public class BorderMutatorTemplate extends StageTemplate { @Value("from") private @Meta String from; - + @Value("replace") private @Meta String replace; - + @Value("to") private @Meta ProbabilityCollection<@Meta TerraBiome> to; - + @Override public Stage get() { return new MutatorStage(new BorderMutator(from, replace, noise, to)); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java index bdd22ade9..5a21ec95b 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceListMutatorTemplate.java @@ -1,7 +1,9 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; + +import java.util.Map; + import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator; @@ -10,19 +12,18 @@ import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Map; @SuppressWarnings("unused") public class ReplaceListMutatorTemplate extends StageTemplate { @Value("default-from") private @Meta String defaultFrom; - + @Value("default-to") private @Meta ProbabilityCollection<@Meta TerraBiome> defaultTo; - + @Value("to") private @Meta Map<@Meta TerraBiome, @Meta ProbabilityCollection<@Meta TerraBiome>> replace; - + @Override public Stage get() { return new MutatorStage(new ReplaceListMutator(replace, defaultFrom, defaultTo, noise)); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java index ea59bd3d8..6dd7196c2 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/ReplaceMutatorTemplate.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; + import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator; @@ -10,14 +10,15 @@ import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; + @SuppressWarnings("unused") public class ReplaceMutatorTemplate extends StageTemplate { @Value("from") private @Meta String from; - + @Value("to") private @Meta ProbabilityCollection<@Meta TerraBiome> to; - + @Override public Stage get() { return new MutatorStage(new ReplaceMutator(from, to, noise)); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java index 77e23c100..400779433 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/stage/mutator/SmoothMutatorTemplate.java @@ -1,11 +1,11 @@ package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator; -import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate; import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator; import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage; + public class SmoothMutatorTemplate extends StageTemplate { @Override public Stage get() { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java index 894d2a86a..39050c873 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java @@ -5,13 +5,14 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.world.biome.TerraBiome; + public class FractalExpander implements BiomeExpander { private final NoiseSampler sampler; - + public FractalExpander(NoiseSampler sampler) { this.sampler = sampler; } - + @Override public TerraBiome getBetween(double x, double z, long seed, TerraBiome... others) { return others[MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), others.length)]; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java index 53273973e..ff8570001 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java @@ -1,11 +1,12 @@ package com.dfsek.terra.addons.biome.pipeline.mutator; +import java.util.Map; + import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Map; public class BorderListMutator implements BiomeMutator { private final String border; @@ -13,15 +14,16 @@ public class BorderListMutator implements BiomeMutator { private final ProbabilityCollection replaceDefault; private final String defaultReplace; private final Map> replace; - - public BorderListMutator(Map> replace, String border, String defaultReplace, NoiseSampler noiseSampler, ProbabilityCollection replaceDefault) { + + public BorderListMutator(Map> replace, String border, String defaultReplace, + NoiseSampler noiseSampler, ProbabilityCollection replaceDefault) { this.border = border; this.noiseSampler = noiseSampler; this.replaceDefault = replaceDefault; this.defaultReplace = defaultReplace; this.replace = replace; } - + @Override public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome origin = viewPoint.getBiome(0, 0); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java index dfd54aa9c..6bd5c39c8 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java @@ -5,19 +5,20 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; + public class BorderMutator implements BiomeMutator { private final String border; private final NoiseSampler noiseSampler; private final ProbabilityCollection replace; private final String replaceTag; - + public BorderMutator(String border, String replaceTag, NoiseSampler noiseSampler, ProbabilityCollection replace) { this.border = border; this.noiseSampler = noiseSampler; this.replace = replace; this.replaceTag = replaceTag; } - + @Override public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome origin = viewPoint.getBiome(0, 0); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java index 8bdb314b8..4712d41a7 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java @@ -1,25 +1,27 @@ package com.dfsek.terra.addons.biome.pipeline.mutator; +import java.util.Map; + import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Map; public class ReplaceListMutator implements BiomeMutator { private final Map> replace; private final NoiseSampler sampler; private final ProbabilityCollection replaceDefault; private final String defaultTag; - - public ReplaceListMutator(Map> replace, String defaultTag, ProbabilityCollection replaceDefault, NoiseSampler sampler) { + + public ReplaceListMutator(Map> replace, String defaultTag, + ProbabilityCollection replaceDefault, NoiseSampler sampler) { this.replace = replace; this.sampler = sampler; this.defaultTag = defaultTag; this.replaceDefault = replaceDefault; } - + @Override public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome center = viewPoint.getBiome(0, 0); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java index ec1c7437c..df77f796d 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java @@ -5,17 +5,18 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; + public class ReplaceMutator implements BiomeMutator { private final String replaceableTag; private final ProbabilityCollection replace; private final NoiseSampler sampler; - + public ReplaceMutator(String replaceable, ProbabilityCollection replace, NoiseSampler sampler) { this.replaceableTag = replaceable; this.replace = replace; this.sampler = sampler; } - + @Override public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java index ac1c7c8a0..3ac06370c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java @@ -1,38 +1,39 @@ package com.dfsek.terra.addons.biome.pipeline.mutator; +import java.util.Objects; + import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Objects; public class SmoothMutator implements BiomeMutator { - + private final NoiseSampler sampler; - + public SmoothMutator(NoiseSampler sampler) { this.sampler = sampler; } - + @Override public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome top = viewPoint.getBiome(1, 0); TerraBiome bottom = viewPoint.getBiome(-1, 0); TerraBiome left = viewPoint.getBiome(0, 1); TerraBiome right = viewPoint.getBiome(0, -1); - - + + boolean vert = Objects.equals(top, bottom) && top != null; boolean horiz = Objects.equals(left, right) && left != null; - + if(vert && horiz) { return MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), 2) == 0 ? left : top; } - + if(vert) return top; if(horiz) return left; - + return viewPoint.getBiome(0, 0); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java index f1cf927c3..694a820cf 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/BiomeSource.java @@ -2,6 +2,7 @@ package com.dfsek.terra.addons.biome.pipeline.source; import com.dfsek.terra.api.world.biome.TerraBiome; + public interface BiomeSource { TerraBiome getBiome(double x, double z, long seed); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java index 1ae08b7b8..d7846a917 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/NoiseSource.java @@ -4,15 +4,16 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.TerraBiome; + public class NoiseSource implements BiomeSource { private final ProbabilityCollection biomes; private final NoiseSampler sampler; - + public NoiseSource(ProbabilityCollection biomes, NoiseSampler sampler) { this.biomes = biomes; this.sampler = sampler; } - + @Override public TerraBiome getBiome(double x, double z, long seed) { return biomes.get(sampler, x, z, seed); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java index 839febab5..6fe1eab4e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java @@ -4,23 +4,24 @@ import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander; import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.Stage; + public class ExpanderStage implements Stage { private final BiomeExpander expander; - + public ExpanderStage(BiomeExpander expander) { this.expander = expander; } - - @Override - public boolean isExpansion() { - return true; - } - + @Override public BiomeHolder apply(BiomeHolder in, long seed) { return in.expand(expander, seed); } - + + @Override + public boolean isExpansion() { + return true; + } + public enum Type { FRACTAL } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java index 4f5f6bf6e..e1b42fb3c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java @@ -4,25 +4,30 @@ import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder; import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.Stage; + public class MutatorStage implements Stage { private final BiomeMutator mutator; - + public MutatorStage(BiomeMutator mutator) { this.mutator = mutator; } - - @Override - public boolean isExpansion() { - return false; - } - + @Override public BiomeHolder apply(BiomeHolder in, long seed) { in.mutate(mutator, seed); return in; } - + + @Override + public boolean isExpansion() { + return false; + } + public enum Type { - REPLACE, REPLACE_LIST, BORDER, BORDER_LIST, SMOOTH + REPLACE, + REPLACE_LIST, + BORDER, + BORDER_LIST, + SMOOTH } } diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java index 2b171547f..694da0b8d 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java @@ -3,13 +3,14 @@ package com.dfsek.terra.addons.biome.single; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + public class SingleBiomeProvider implements BiomeProvider { private final TerraBiome biome; - + public SingleBiomeProvider(TerraBiome biome) { this.biome = biome; } - + @Override public TerraBiome getBiome(int x, int z, long seed) { return biome; diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java index 704a20d28..3f63b811a 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java @@ -1,6 +1,9 @@ package com.dfsek.terra.addons.biome.single; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.annotations.Addon; @@ -13,26 +16,27 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import java.util.function.Supplier; @Addon("biome-provider-single") @Author("Terra") @Version("1.0.0") public class SingleBiomeProviderAddon extends TerraAddon { - public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {}; - + public static final TypeKey>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { + }; + @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry(PROVIDER_REGISTRY_KEY); - providerRegistry.register("SINGLE", SingleBiomeProviderTemplate::new); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( + PROVIDER_REGISTRY_KEY); + providerRegistry.register("SINGLE", SingleBiomeProviderTemplate::new); + }) + .failThrough(); } } diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java index bbb3f4f1e..034c7887b 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderTemplate.java @@ -2,14 +2,16 @@ package com.dfsek.terra.addons.biome.single; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + public class SingleBiomeProviderTemplate implements ObjectTemplate { @Value("biome") private @Meta TerraBiome biome; - + @Override public BiomeProvider get() { return new SingleBiomeProvider(biome); diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/BiomePaletteTemplate.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/BiomePaletteTemplate.java index ed14d2faf..b0c797800 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/BiomePaletteTemplate.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/BiomePaletteTemplate.java @@ -3,26 +3,26 @@ package com.dfsek.terra.addons.chunkgenerator; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo; import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.world.generator.Palette; -public class BiomePaletteTemplate implements ObjectTemplate { - @Value("palette") - private @Meta PaletteHolder palette; +public class BiomePaletteTemplate implements ObjectTemplate { @Value("slant") @Default - private @Meta SlantHolder slant = null; - + private final @Meta SlantHolder slant; + @Value("palette") + private @Meta PaletteHolder palette; @Value("ocean.level") private @Meta int seaLevel; - + @Value("ocean.palette") private @Meta Palette oceanPalette; - + @Override public PaletteInfo get() { return new PaletteInfo(palette, slant, oceanPalette, seaLevel); diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java index bd5acee77..1ad12108f 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java @@ -17,34 +17,36 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; + @Addon("chunk-generator-noise-3d") @Author("Terra") @Version("1.0.0") public class NoiseChunkGenerator3DAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - event.getPack().getOrCreateRegistry(ChunkGeneratorProvider.class).register("NOISE_3D", pack -> new NoiseChunkGenerator3D(pack, main)); - event.getPack() - .applyLoader(SlantHolder.class, new SlantHolderLoader()) - .applyLoader(PaletteHolder.class, new PaletteHolderLoader()); - }) - .failThrough(); - + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + event.getPack().getOrCreateRegistry(ChunkGeneratorProvider.class).register("NOISE_3D", + pack -> new NoiseChunkGenerator3D(pack, main)); + event.getPack() + .applyLoader(SlantHolder.class, new SlantHolderLoader()) + .applyLoader(PaletteHolder.class, new PaletteHolderLoader()); + }) + .failThrough(); + main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigurationLoadEvent.class) - .then(event -> { - if(event.is(TerraBiome.class)) { - event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomePaletteTemplate()).get()); - } - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationLoadEvent.class) + .then(event -> { + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomePaletteTemplate()).get()); + } + }) + .failThrough(); } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/PaletteUtil.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/PaletteUtil.java index 1b370cfeb..aa295094a 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/PaletteUtil.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/PaletteUtil.java @@ -7,6 +7,7 @@ import com.dfsek.terra.api.world.biome.GenerationSettings; import com.dfsek.terra.api.world.generator.Palette; import com.dfsek.terra.api.world.generator.Sampler; + public final class PaletteUtil { public static Palette getPalette(int x, int y, int z, GenerationSettings c, Sampler sampler, PaletteInfo paletteInfo) { SlantHolder slant = paletteInfo.getSlantHolder(); @@ -16,7 +17,7 @@ public final class PaletteUtil { return slant.getPalette(slope).getPalette(y); } } - + return paletteInfo.getPaletteHolder().getPalette(y); } } \ No newline at end of file diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java index fe9ea7d8e..f76391908 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/generators/NoiseChunkGenerator3D.java @@ -1,5 +1,12 @@ package com.dfsek.terra.addons.chunkgenerator.generation.generators; +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + import com.dfsek.terra.addons.chunkgenerator.PaletteUtil; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D; import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo; @@ -16,32 +23,27 @@ import com.dfsek.terra.api.world.biome.GenerationSettings; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkData; -import com.dfsek.terra.api.world.generator.Palette; -import com.dfsek.terra.api.world.generator.Sampler; import com.dfsek.terra.api.world.generator.ChunkGenerator; import com.dfsek.terra.api.world.generator.GenerationStage; -import net.jafama.FastMath; -import org.jetbrains.annotations.NotNull; +import com.dfsek.terra.api.world.generator.Palette; +import com.dfsek.terra.api.world.generator.Sampler; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; public class NoiseChunkGenerator3D implements ChunkGenerator { private final ConfigPack configPack; private final TerraPlugin main; private final List generationStages = new ArrayList<>(); - + private final BlockState air; - + public NoiseChunkGenerator3D(ConfigPack c, TerraPlugin main) { this.configPack = c; this.main = main; this.air = main.getWorldHandle().air(); c.getStages().forEach(stage -> generationStages.add(stage.newInstance(c))); } - - @SuppressWarnings({"try"}) + + @SuppressWarnings("try") static void biomes(@NotNull World world, int chunkX, int chunkZ, @NotNull BiomeGrid biome, TerraPlugin main) { try(ProfileFrame ignore = main.getProfiler().profile("biomes")) { int xOrig = (chunkX << 4); @@ -53,73 +55,64 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { int cx = xOrig + (x << 2); int cz = zOrig + (z << 2); TerraBiome b = grid.getBiome(cx, cz, seed); - + biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator().getBiomeNoise(), cx, 0, cz, world.getSeed())); } } } } - + @Override - public ConfigPack getConfigPack() { - return configPack; - } - - @Override - public TerraPlugin getMain() { - return main; - } - - @Override - @SuppressWarnings({"try"}) + @SuppressWarnings("try") public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) { try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_3d")) { BiomeProvider grid = world.getBiomeProvider(); - + int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - + Sampler sampler = world.getConfig().getSamplerCache().getChunk(chunkX, chunkZ); - + long seed = world.getSeed(); - + for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { int paletteLevel = 0; - + int cx = xOrig + x; int cz = zOrig + z; - + TerraBiome biome = grid.getBiome(cx, cz, seed); - + PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class); - + if(paletteInfo == null) { main.logger().info("null palette: " + biome.getID()); } - + GenerationSettings generationSettings = biome.getGenerator(); - + int sea = paletteInfo.getSeaLevel(); Palette seaPalette = paletteInfo.getOcean(); - + boolean justSet = false; BlockState data = null; for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) { if(sampler.sample(x, y, z) > 0) { justSet = true; - - data = PaletteUtil.getPalette(x, y, z, generationSettings, sampler, paletteInfo).get(paletteLevel, cx, y, cz, seed); + + data = PaletteUtil.getPalette(x, y, z, generationSettings, sampler, paletteInfo).get(paletteLevel, cx, y, cz, + seed); chunk.setBlock(x, y, z, data); - + paletteLevel++; } else if(y <= sea) { chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig, seed)); - + justSet = false; paletteLevel = 0; - } else { - + } else { + justSet = false; paletteLevel = 0; } @@ -129,47 +122,38 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { return chunk; } } - - private boolean placeStair(BlockState orig, ChunkData chunk, Vector3 block, double thresh, Sampler sampler, BlockState stairNew) { - - if(sampler.sample(block.getBlockX() - 0.55, block.getY(), block.getZ()) > thresh) { - stairNew.set(Properties.DIRECTION, Direction.WEST); - } else if(sampler.sample(block.getBlockX(), block.getY(), block.getZ() - 0.55) > thresh) { - stairNew.set(Properties.DIRECTION, Direction.NORTH); - } else if(sampler.sample(block.getBlockX(), block.getY(), block.getZ() + 0.55) > thresh) { - stairNew.set(Properties.DIRECTION, Direction.SOUTH); - } else if(sampler.sample(block.getX() + 0.55, block.getY(), block.getZ()) > thresh) { - stairNew.set(Properties.DIRECTION, Direction.EAST); - } else stairNew = null; - if(stairNew != null) { - stairNew.setIfPresent(Properties.WATERLOGGED, orig.getBlockType().isWater()); - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); - return true; - } - return false; - } - + @Override public void generateBiomes(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { biomes(world, chunkX, chunkZ, biome, main); } - + @Override public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) { return new Sampler3D(chunkX, chunkZ, provider, world, elevationSmooth); } - + + @Override + public ConfigPack getConfigPack() { + return configPack; + } + + @Override + public TerraPlugin getMain() { + return main; + } + @Override public List getGenerationStages() { return generationStages; } - + @Override public BlockState getBlock(World world, int x, int y, int z) { BiomeProvider provider = world.getBiomeProvider(); TerraBiome biome = provider.getBiome(x, z, world.getSeed()); Sampler sampler = world.getConfig().getSamplerCache().get(x, z); - + PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class); Palette palette = PaletteUtil.getPalette(x, y, z, biome.getGenerator(), sampler, paletteInfo); int fdX = FastMath.floorMod(x, 16); @@ -186,4 +170,23 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { return paletteInfo.getOcean().get(paletteInfo.getSeaLevel() - y, x, y, z, world.getSeed()); } else return air; } + + private boolean placeStair(BlockState orig, ChunkData chunk, Vector3 block, double thresh, Sampler sampler, BlockState stairNew) { + + if(sampler.sample(block.getBlockX() - 0.55, block.getY(), block.getZ()) > thresh) { + stairNew.set(Properties.DIRECTION, Direction.WEST); + } else if(sampler.sample(block.getBlockX(), block.getY(), block.getZ() - 0.55) > thresh) { + stairNew.set(Properties.DIRECTION, Direction.NORTH); + } else if(sampler.sample(block.getBlockX(), block.getY(), block.getZ() + 0.55) > thresh) { + stairNew.set(Properties.DIRECTION, Direction.SOUTH); + } else if(sampler.sample(block.getX() + 0.55, block.getY(), block.getZ()) > thresh) { + stairNew.set(Properties.DIRECTION, Direction.EAST); + } else stairNew = null; + if(stairNew != null) { + stairNew.setIfPresent(Properties.WATERLOGGED, orig.getBlockType().isWater()); + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); + return true; + } + return false; + } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java index a610f6f15..8773732df 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java @@ -1,16 +1,18 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; +import net.jafama.FastMath; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; + import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.GenerationSettings; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkInterpolator; -import net.jafama.FastMath; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiFunction; /** * Class to abstract away the Interpolators needed to generate a chunk.
@@ -19,7 +21,7 @@ import java.util.function.BiFunction; public class ChunkInterpolator2D implements ChunkInterpolator { private final Interpolator[][] interpGrid = new Interpolator[4][4]; private final BiFunction noiseGetter; - + /** * Instantiates a 3D ChunkInterpolator3D at a pair of chunk coordinates. * @@ -27,33 +29,36 @@ public class ChunkInterpolator2D implements ChunkInterpolator { * @param chunkZ Z coordinate of the chunk. * @param provider Biome Provider to use for biome fetching. */ - public ChunkInterpolator2D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction noiseGetter) { + public ChunkInterpolator2D(World w, int chunkX, int chunkZ, BiomeProvider provider, + BiFunction noiseGetter) { this.noiseGetter = noiseGetter; int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; - + long seed = w.getSeed(); - + double[][] noiseStorage = new double[5][5]; - + for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { GenerationSettings generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(); Map genMap = new HashMap<>(); - + int step = generationSettings.getBlendStep(); int blend = generationSettings.getBlendDistance(); - + for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { - genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(), g -> new MutableInteger(0)).increment(); // Increment by 1 + genMap.computeIfAbsent( + provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(), + g -> new MutableInteger(0)).increment(); // Increment by 1 } } - + noiseStorage[x][z] = computeNoise(genMap, (x << 2) + xOrigin, 0, (z << 2) + zOrigin); } } - + for(int x = 0; x < 4; x++) { for(int z = 0; z < 4; z++) { interpGrid[x][z] = new Interpolator( @@ -64,27 +69,28 @@ public class ChunkInterpolator2D implements ChunkInterpolator { } } } - + private static int reRange(int value, int high) { return FastMath.max(FastMath.min(value, high), 0); } - + public double computeNoise(GenerationSettings generationSettings, double x, double y, double z) { return noiseGetter.apply(generationSettings, new Vector3(x, y, z)); } - + /** * Gets the noise at a pair of internal chunk coordinates. * * @param x The internal X coordinate (0-15). * @param z The internal Z coordinate (0-15). + * * @return double - The interpolated noise at the coordinates. */ @Override public double getNoise(double x, double y, double z) { return interpGrid[reRange(((int) x) / 4, 3)][reRange(((int) z) / 4, 3)].bilerp((x % 4) / 4, (z % 4) / 4); } - + public double getNoise(int x, int y, int z) { return interpGrid[x / 4][z / 4].bilerp((double) (x % 4) / 4, (double) (z % 4) / 4); } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java index 982a76d7f..909500d09 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java @@ -1,16 +1,18 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; +import net.jafama.FastMath; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; + import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.GenerationSettings; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkInterpolator; -import net.jafama.FastMath; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiFunction; /** * Class to abstract away the Interpolators needed to generate a chunk.
@@ -19,10 +21,10 @@ import java.util.function.BiFunction; public class ChunkInterpolator3D implements ChunkInterpolator { private final Interpolator3[][][] interpGrid; private final BiFunction noiseGetter; - + private final int min; private final int max; - + /** * Instantiates a 3D ChunkInterpolator3D at a pair of chunk coordinates. * @@ -30,43 +32,46 @@ public class ChunkInterpolator3D implements ChunkInterpolator { * @param chunkZ Z coordinate of the chunk. * @param provider Biome Provider to use for biome fetching. */ - public ChunkInterpolator3D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction noiseGetter) { + public ChunkInterpolator3D(World w, int chunkX, int chunkZ, BiomeProvider provider, + BiFunction noiseGetter) { this.noiseGetter = noiseGetter; int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; - + this.max = w.getMaxHeight(); this.min = w.getMinHeight(); int range = max - min + 1; - + int size = range >> 2; - + interpGrid = new Interpolator3[4][size][4]; - + double[][][] noiseStorage = new double[5][5][size + 1]; - + long seed = w.getSeed(); - + for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { GenerationSettings generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(); Map genMap = new HashMap<>(); - + int step = generationSettings.getBlendStep(); int blend = generationSettings.getBlendDistance(); - + for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { - genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(), g -> new MutableInteger(0)).increment(); // Increment by 1 + genMap.computeIfAbsent( + provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(), + g -> new MutableInteger(0)).increment(); // Increment by 1 } } - + for(int y = 0; y < size + 1; y++) { noiseStorage[x][z][y] = computeNoise(genMap, (x << 2) + xOrigin, (y << 2) + min, (z << 2) + zOrigin); } } } - + for(int x = 0; x < 4; x++) { for(int z = 0; z < 4; z++) { for(int y = 0; y < size; y++) { @@ -83,27 +88,30 @@ public class ChunkInterpolator3D implements ChunkInterpolator { } } } - + private static int reRange(int value, int high) { return FastMath.max(FastMath.min(value, high), 0); } - + public double computeNoise(GenerationSettings generationSettings, double x, double y, double z) { return noiseGetter.apply(generationSettings, new Vector3(x, y, z)); } - + /** * Gets the noise at a pair of internal chunk coordinates. * * @param x The internal X coordinate (0-15). * @param z The internal Z coordinate (0-15). + * * @return double - The interpolated noise at the coordinates. */ @Override public double getNoise(double x, double y, double z) { - return interpGrid[reRange(((int) x) / 4, 3)][(FastMath.max(FastMath.min(((int) y), max), min) - min) / 4][reRange(((int) z) / 4, 3)].trilerp((x % 4) / 4, (y % 4) / 4, (z % 4) / 4); + return interpGrid[reRange(((int) x) / 4, 3)][(FastMath.max(FastMath.min(((int) y), max), min) - min) / 4][reRange(((int) z) / 4, + 3)].trilerp( + (x % 4) / 4, (y % 4) / 4, (z % 4) / 4); } - + public double getNoise(int x, int y, int z) { return interpGrid[x / 4][(y - min) / 4][z / 4].trilerp((double) (x % 4) / 4, (double) (y % 4) / 4, (double) (z % 4) / 4); } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java index 80ae9899d..e2b01942e 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java @@ -4,24 +4,25 @@ import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.GenerationSettings; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + public class ElevationInterpolator { private final double[][] values = new double[18][18]; - + public ElevationInterpolator(World world, int chunkX, int chunkZ, BiomeProvider provider, int smooth) { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; - + long seed = world.getSeed(); - + GenerationSettings[][] gens = new GenerationSettings[18 + 2 * smooth][18 + 2 * smooth]; - + // Precompute generators. for(int x = -1 - smooth; x <= 16 + smooth; x++) { for(int z = -1 - smooth; z <= 16 + smooth; z++) { gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z, seed).getGenerator(); } } - + for(int x = -1; x <= 16; x++) { for(int z = -1; z <= 16; z++) { double noise = 0; @@ -37,7 +38,7 @@ public class ElevationInterpolator { } } } - + public double getElevation(int x, int z) { return values[x + 1][z + 1]; } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java index 37bc0eb76..d67ac6c10 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator.java @@ -5,7 +5,7 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; */ public class Interpolator { private final double v0, v1, v2, v3; - + /** * Constructs an interpolator with given values as vertices of a unit square. * @@ -20,24 +20,26 @@ public class Interpolator { this.v2 = v2; this.v3 = v3; } - + /** * 1D Linear interpolation between 2 points 1 unit apart. * * @param t - Distance from v0. Total distance between v0 and v1 is 1 unit. * @param v0 - Value at v0. * @param v1 - Value at v1. + * * @return double - The interpolated value. */ public static double lerp(double t, double v0, double v1) { return v0 + t * (v1 - v0); } - + /** * 2D Bilinear interpolation between 4 points on a unit square. * * @param s - X value * @param t - Z value + * * @return double - The interpolated value. */ public double bilerp(double s, double t) { diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java index ddedc713b..1d80fb025 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/Interpolator3.java @@ -6,7 +6,7 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; public class Interpolator3 { private final Interpolator bottom; private final Interpolator top; - + /** * Constructs an interpolator with given values as vertices of a unit cube. * * @param _000 The value at (t, u, v) = (0, 0, 0). @@ -25,7 +25,7 @@ public class Interpolator3 { this.top = new Interpolator(_000, _010, _001, _011); this.bottom = new Interpolator(_100, _110, _101, _111); } - + public double trilerp(double x, double y, double z) { return Interpolator.lerp(x, top.bilerp(y, z), bottom.bilerp(y, z)); } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java index d0092503c..1b7136b4b 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java @@ -1,26 +1,30 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers; +import net.jafama.FastMath; + import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator3D; import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.Sampler; -import net.jafama.FastMath; + public class Sampler3D implements Sampler { private final ChunkInterpolator3D interpolator; private final ElevationInterpolator elevationInterpolator; - + public Sampler3D(int x, int z, BiomeProvider provider, World world, int elevationSmooth) { - this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoiseSeeded(coord, world.getSeed())); + this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler() + .getNoiseSeeded(coord, + world.getSeed())); this.elevationInterpolator = new ElevationInterpolator(world, x, z, provider, elevationSmooth); } - + @Override public double sample(double x, double y, double z) { return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z)); } - + @Override public double sample(int x, int y, int z) { return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z)); diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java index e6c009a55..55d2a2dac 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolder.java @@ -2,21 +2,22 @@ package com.dfsek.terra.addons.chunkgenerator.palette; import com.dfsek.terra.api.world.generator.Palette; + public class PaletteHolder { private final Palette[] palettes; private final int offset; - + protected PaletteHolder(Palette[] palettes, int offset) { this.palettes = palettes; this.offset = offset; } - + public Palette getPalette(int y) { int index = y + offset; return index >= 0 - ? index < palettes.length - ? palettes[index] - : palettes[palettes.length - 1] - : palettes[0]; + ? index < palettes.length + ? palettes[index] + : palettes[palettes.length - 1] + : palettes[0]; } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java index 485c03c9d..61042145b 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderBuilder.java @@ -1,24 +1,26 @@ package com.dfsek.terra.addons.chunkgenerator.palette; -import com.dfsek.terra.api.world.generator.Palette; import net.jafama.FastMath; import java.util.Map; import java.util.TreeMap; +import com.dfsek.terra.api.world.generator.Palette; + + public class PaletteHolderBuilder { private final TreeMap paletteMap = new TreeMap<>(); - + public PaletteHolderBuilder add(int y, Palette palette) { paletteMap.put(y, palette); return this; } - + public PaletteHolder build() { - + int min = FastMath.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0); int max = FastMath.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255); - + Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min]; for(int y = min; y <= FastMath.max(paletteMap.lastKey(), max); y++) { Palette d = null; diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderLoader.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderLoader.java index 61286fe69..bf0bc3bb5 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderLoader.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteHolderLoader.java @@ -3,12 +3,14 @@ package com.dfsek.terra.addons.chunkgenerator.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.world.generator.Palette; import java.lang.reflect.AnnotatedType; import java.util.List; import java.util.Map; +import com.dfsek.terra.api.world.generator.Palette; + + public class PaletteHolderLoader implements TypeLoader { @SuppressWarnings("unchecked") @Override diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteInfo.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteInfo.java index 109da179b..fd7b331b7 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteInfo.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/PaletteInfo.java @@ -3,32 +3,33 @@ package com.dfsek.terra.addons.chunkgenerator.palette; import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.world.generator.Palette; + public class PaletteInfo implements Properties { private final PaletteHolder paletteHolder; private final SlantHolder slantHolder; private final Palette ocean; - + private final int seaLevel; - + public PaletteInfo(PaletteHolder paletteHolder, SlantHolder slantHolder, Palette ocean, int seaLevel) { this.paletteHolder = paletteHolder; this.slantHolder = slantHolder; this.ocean = ocean; this.seaLevel = seaLevel; } - + public Palette getOcean() { return ocean; } - + public PaletteHolder getPaletteHolder() { return paletteHolder; } - + public SlantHolder getSlantHolder() { return slantHolder; } - + public int getSeaLevel() { return seaLevel; } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java index 3b8e3fc73..0845604dc 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java @@ -3,19 +3,20 @@ package com.dfsek.terra.addons.chunkgenerator.palette; import java.util.TreeMap; + public class SlantHolder { private final TreeMap layers; private final double minSlope; - + public SlantHolder(TreeMap layers, double minSlope) { this.layers = layers; this.minSlope = minSlope; } - + public PaletteHolder getPalette(double slope) { return layers.floorEntry(slope).getValue(); } - + public double getMinSlope() { return minSlope; } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolderLoader.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolderLoader.java index 6b7e0a8b3..74869b9dc 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolderLoader.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolderLoader.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; + @SuppressWarnings("unchecked") public class SlantHolderLoader implements TypeLoader { @Override @@ -16,13 +17,13 @@ public class SlantHolderLoader implements TypeLoader { List> layers = (List>) o; TreeMap slantLayers = new TreeMap<>(); double minThreshold = Double.MAX_VALUE; - + for(Map layer : layers) { double threshold = ((Number) layer.get("threshold")).doubleValue(); if(threshold < minThreshold) minThreshold = threshold; slantLayers.put(threshold, configLoader.loadType(PaletteHolder.class, layer.get("palette"))); } - + return new SlantHolder(slantLayers, minThreshold); } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java index 832b00ccd..ac7a72943 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeAddon.java @@ -11,22 +11,23 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.injection.annotations.Inject; + @Addon("config-biome") @Author("Terra") @Version("1.0.0") public class BiomeAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - event.getPack().registerConfigType(new BiomeConfigType(event.getPack()), "BIOME", 5); - event.getPack().applyLoader(PaletteHolder.class, new PaletteHolderLoader()); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + event.getPack().registerConfigType(new BiomeConfigType(event.getPack()), "BIOME", 5); + event.getPack().applyLoader(PaletteHolder.class, new PaletteHolderLoader()); + }) + .failThrough(); } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java index d6cdb8416..4b7702d09 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java @@ -2,6 +2,9 @@ package com.dfsek.terra.addons.biome; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.TypeLoader; + +import java.util.function.Supplier; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; @@ -10,32 +13,16 @@ import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.function.Supplier; public class BiomeConfigType implements ConfigType { + public static final TypeKey BIOME_TYPE_TOKEN = new TypeKey<>() { + }; private final BiomeFactory factory; - - public static final TypeKey BIOME_TYPE_TOKEN = new TypeKey<>() {}; - + public BiomeConfigType(ConfigPack pack) { this.factory = new BiomeFactory(pack); } - - @Override - public BiomeTemplate getTemplate(ConfigPack pack, TerraPlugin main) { - return new BiomeTemplate(pack, main); - } - - @Override - public ConfigFactory getFactory() { - return factory; - } - - @Override - public TypeKey getTypeKey() { - return BIOME_TYPE_TOKEN; - } - + @Override public Supplier> registrySupplier(ConfigPack pack) { return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { @@ -46,4 +33,19 @@ public class BiomeConfigType implements ConfigType { return obj; }); } + + @Override + public BiomeTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new BiomeTemplate(pack, main); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeKey() { + return BIOME_TYPE_TOKEN; + } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java index 0283c1d96..8f791fd22 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeFactory.java @@ -5,17 +5,22 @@ import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.TerraBiome; + public class BiomeFactory implements ConfigFactory { private final ConfigPack pack; - + public BiomeFactory(ConfigPack pack) { this.pack = pack; } - + @Override public TerraBiome build(BiomeTemplate template, TerraPlugin main) { - UserDefinedGenerationSettings generator = new UserDefinedGenerationSettings(template.getNoiseEquation(), template.getElevationEquation(), template.getCarvingEquation(), template.getBiomeNoise(), template.getElevationWeight(), - template.getBlendDistance(), template.getBlendStep(), template.getBlendWeight()); + UserDefinedGenerationSettings generator = new UserDefinedGenerationSettings(template.getNoiseEquation(), + template.getElevationEquation(), + template.getCarvingEquation(), template.getBiomeNoise(), + template.getElevationWeight(), + template.getBlendDistance(), template.getBlendStep(), + template.getBlendWeight()); return new UserDefinedBiome(template.getVanilla(), generator, template); } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java index 0137ababb..0d864b212 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeTemplate.java @@ -5,6 +5,14 @@ import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.config.AbstractableTemplate; @@ -15,196 +23,191 @@ import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generator.Palette; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -@SuppressWarnings({"FieldMayBeFinal", "unused"}) +@SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class BiomeTemplate implements AbstractableTemplate, ValidatedConfigTemplate { private final ConfigPack pack; - + @Value("id") @Final private @Meta String id; - + @Value("extends") @Final @Default private List extended = Collections.emptyList(); - + @Value("variables") @Default private @Meta Map variables = new HashMap<>(); - + @Value("beta.carving.equation") @Default private @Meta NoiseSampler carvingEquation = NoiseSampler.zero(); - + @Value("vanilla") private @Meta ProbabilityCollection vanilla; - + @Value("biome-noise") @Default private @Meta NoiseSampler biomeNoise = NoiseSampler.zero(); - + @Value("blend.distance") @Default private @Meta int blendDistance = 3; - + @Value("blend.weight") @Default private @Meta double blendWeight = 1; - + @Value("blend.step") @Default private @Meta int blendStep = 4; - + @Value("noise") private @Meta NoiseSampler noiseEquation; - + @Value("ocean.level") @Default private @Meta int seaLevel = 62; - + @Value("elevation.equation") @Default private @Meta NoiseSampler elevationEquation = NoiseSampler.zero(); - + @Value("elevation.weight") @Default private @Meta double elevationWeight = 1; - + @Value("slabs.enable") @Default private @Meta boolean doSlabs = false; - + @Value("slabs.threshold") @Default private @Meta double slabThreshold = 0.0075D; - + @Value("slabs.palettes") @Default private @Meta Map<@Meta BlockType, @Meta Palette> slabPalettes; - + @Value("slabs.stair-palettes") @Default private @Meta Map<@Meta BlockType, @Meta Palette> stairPalettes; - + @Value("interpolate-elevation") @Default private @Meta boolean interpolateElevation = true; - + @Value("color") @Final @Default private @Meta int color = 0; - + @Value("tags") @Default private @Meta Set<@Meta String> tags = new HashSet<>(); - + @Value("colors") @Default - private @Meta Map colors = new HashMap<>(); // Plain ol' map, so platforms can decide what to do with colors (if anything). - + private @Meta Map colors = new HashMap<>(); + // Plain ol' map, so platforms can decide what to do with colors (if anything). + public BiomeTemplate(ConfigPack pack, TerraPlugin main) { this.pack = pack; } - - public List getExtended() { - return extended; - } - - public Set getTags() { - return tags; - } - - public Map getColors() { - return colors; - } - - public double getBlendWeight() { - return blendWeight; - } - - public int getColor() { - return color; - } - - public int getBlendDistance() { - return blendDistance; - } - + public boolean interpolateElevation() { return interpolateElevation; } - - public double getSlabThreshold() { - return slabThreshold; - } - + public boolean doSlabs() { return doSlabs; } - - public Map getSlabPalettes() { - return slabPalettes; - } - - public Map getStairPalettes() { - return stairPalettes; - } - - public NoiseSampler getBiomeNoise() { - return biomeNoise; - } - - public NoiseSampler getElevationEquation() { - return elevationEquation; - } - - public NoiseSampler getCarvingEquation() { - return carvingEquation; - } - - public ConfigPack getPack() { - return pack; - } - - public int getSeaLevel() { - return seaLevel; - } - - public String getID() { - return id; - } - - public ProbabilityCollection getVanilla() { - return vanilla; - } - - public NoiseSampler getNoiseEquation() { - return noiseEquation; - } - - public double getElevationWeight() { - return elevationWeight; - } - - public int getBlendStep() { - return blendStep; - } - - public Map getVariables() { - return variables; - } - + @Override public boolean validate() throws ValidationException { color |= 0xff000000; // Alpha adjustment return true; } + + public List getExtended() { + return extended; + } + + public Set getTags() { + return tags; + } + + public Map getColors() { + return colors; + } + + public double getBlendWeight() { + return blendWeight; + } + + public int getColor() { + return color; + } + + public int getBlendDistance() { + return blendDistance; + } + + public double getSlabThreshold() { + return slabThreshold; + } + + public Map getSlabPalettes() { + return slabPalettes; + } + + public Map getStairPalettes() { + return stairPalettes; + } + + public NoiseSampler getBiomeNoise() { + return biomeNoise; + } + + public NoiseSampler getElevationEquation() { + return elevationEquation; + } + + public NoiseSampler getCarvingEquation() { + return carvingEquation; + } + + public ConfigPack getPack() { + return pack; + } + + public int getSeaLevel() { + return seaLevel; + } + + public String getID() { + return id; + } + + public ProbabilityCollection getVanilla() { + return vanilla; + } + + public NoiseSampler getNoiseEquation() { + return noiseEquation; + } + + public double getElevationWeight() { + return elevationWeight; + } + + public int getBlendStep() { + return blendStep; + } + + public Map getVariables() { + return variables; + } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BlankFunction.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BlankFunction.java index 20acac0df..7a94513a1 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BlankFunction.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BlankFunction.java @@ -3,23 +3,24 @@ package com.dfsek.terra.addons.biome; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; + public class BlankFunction implements DynamicFunction { private final int args; - + public BlankFunction(int args) { this.args = args; } - - @Override - public int getArgNumber() { - return args; - } - + @Override public double eval(double... d) { return 0; } - + + @Override + public int getArgNumber() { + return args; + } + @Override public boolean isStateless() { return true; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java index 500753950..5440ed440 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/PaletteSettingsImpl.java @@ -4,13 +4,14 @@ import com.dfsek.terra.addons.biome.holder.PaletteHolder; import com.dfsek.terra.api.world.biome.PaletteSettings; import com.dfsek.terra.api.world.generator.Palette; + public class PaletteSettingsImpl implements PaletteSettings { private final PaletteHolder palette; - + public PaletteSettingsImpl(PaletteHolder palette) { this.palette = palette; } - + @Override public Palette getPalette(int y) { return palette.getPalette(y); diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java index a26bf5601..d10b7c70f 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedBiome.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.biome; +import java.util.Set; + import com.dfsek.terra.api.properties.Context; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.GenerationSettings; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Set; /** * Class representing a config-defined biome @@ -18,9 +19,9 @@ public class UserDefinedBiome implements TerraBiome { private final BiomeTemplate config; private final int color; private final Set tags; - + private final Context context = new Context(); - + public UserDefinedBiome(ProbabilityCollection vanilla, UserDefinedGenerationSettings gen, BiomeTemplate config) { this.vanilla = vanilla; this.gen = gen; @@ -30,7 +31,12 @@ public class UserDefinedBiome implements TerraBiome { this.tags = config.getTags(); tags.add("BIOME:" + id); } - + + @Override + public String toString() { + return "{BIOME:" + getID() + "}"; + } + /** * Gets the Vanilla biomes to represent the custom biome. * @@ -40,36 +46,31 @@ public class UserDefinedBiome implements TerraBiome { public ProbabilityCollection getVanillaBiomes() { return vanilla; } - - @Override - public String getID() { - return id; - } - - public BiomeTemplate getConfig() { - return config; - } - + @Override public GenerationSettings getGenerator() { return gen; } - + @Override public int getColor() { return color; } - + @Override public Set getTags() { return tags; } - + @Override - public String toString() { - return "{BIOME:" + getID() + "}"; + public String getID() { + return id; } - + + public BiomeTemplate getConfig() { + return config; + } + @Override public Context getContext() { return context; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedGenerationSettings.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedGenerationSettings.java index b9ad1dd46..dbc5607b0 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedGenerationSettings.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/UserDefinedGenerationSettings.java @@ -3,65 +3,67 @@ package com.dfsek.terra.addons.biome; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.world.biome.GenerationSettings; -public class UserDefinedGenerationSettings implements GenerationSettings { +public class UserDefinedGenerationSettings implements GenerationSettings { + private final NoiseSampler noise; private final NoiseSampler elevation; private final NoiseSampler carving; - + private final NoiseSampler biomeNoise; private final double elevationWeight; private final int blendDistance; private final int blendStep; private final double blendWeight; - - public UserDefinedGenerationSettings(NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) { + + public UserDefinedGenerationSettings(NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, + double elevationWeight, int blendDistance, int blendStep, double blendWeight) { this.noise = noise; this.elevation = elevation; this.carving = carving; - + this.biomeNoise = biomeNoise; this.elevationWeight = elevationWeight; this.blendDistance = blendDistance; this.blendStep = blendStep; this.blendWeight = blendWeight; } - + @Override public NoiseSampler getBaseSampler() { return noise; } - + @Override public NoiseSampler getElevationSampler() { return elevation; } - + @Override public NoiseSampler getCarver() { return carving; } - + @Override public int getBlendDistance() { return blendDistance; } - + @Override public double getWeight() { return blendWeight; } - + @Override public NoiseSampler getBiomeNoise() { return biomeNoise; } - + @Override public double getElevationWeight() { return elevationWeight; } - + @Override public int getBlendStep() { return blendStep; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java index c639d772d..22c41ac88 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java @@ -1,19 +1,21 @@ package com.dfsek.terra.addons.biome.command.biome; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import org.jetbrains.annotations.NotNull; -import java.util.function.Consumer; /** * Runnable that locates a biome asynchronously */ public class AsyncBiomeFinder implements Runnable { - + protected final BiomeProvider provider; protected final TerraBiome target; protected final int startRadius; @@ -24,8 +26,9 @@ public class AsyncBiomeFinder implements Runnable { protected final TerraPlugin main; private final Consumer callback; protected int searchSize = 1; - - public AsyncBiomeFinder(BiomeProvider provider, TerraBiome target, @NotNull Vector3 origin, World world, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { + + public AsyncBiomeFinder(BiomeProvider provider, TerraBiome target, @NotNull Vector3 origin, World world, int startRadius, int maxRadius, + Consumer callback, TerraPlugin main) { this.provider = provider; this.target = target; this.main = main; @@ -36,35 +39,23 @@ public class AsyncBiomeFinder implements Runnable { this.world = world; this.callback = callback; } - - /** - * Helper method to get biome at location - * - * @param x X coordinate - * @param z Z coordinate - * @return TerraBiome at coordinates - */ - public boolean isValid(int x, int z, TerraBiome target) { - int res = main.getTerraConfig().getBiomeSearchResolution(); - return getProvider().getBiome(x * res, z * res, world.getSeed()).equals(target); - } - + public Vector3 finalizeVector(Vector3 orig) { return orig.multiply(main.getTerraConfig().getBiomeSearchResolution()); } - + @Override public void run() { int x = centerX; int z = centerZ; - + x /= searchSize; z /= searchSize; - + int run = 1; boolean toggle = true; boolean found = false; - + main: for(int i = startRadius; i < maxRadius; i++) { for(int j = 0; j < run; j++) { @@ -89,23 +80,36 @@ public class AsyncBiomeFinder implements Runnable { Vector3 finalSpawn = found ? finalizeVector(new Vector3(x, 0, z)) : null; callback.accept(finalSpawn); } - + + /** + * Helper method to get biome at location + * + * @param x X coordinate + * @param z Z coordinate + * + * @return TerraBiome at coordinates + */ + public boolean isValid(int x, int z, TerraBiome target) { + int res = main.getTerraConfig().getBiomeSearchResolution(); + return getProvider().getBiome(x * res, z * res, world.getSeed()).equals(target); + } + public TerraBiome getTarget() { return target; } - + public World getWorld() { return world; } - + public BiomeProvider getProvider() { return provider; } - + public int getSearchSize() { return searchSize; } - + public void setSearchSize(int searchSize) { this.searchSize = searchSize; } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java index a5eebad2b..ee9dc3cd4 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java @@ -12,18 +12,11 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + @Command( subcommands = { - @Subcommand( - value = "info", - aliases = {"i"}, - clazz = BiomeInfoCommand.class - ), - @Subcommand( - value = "locate", - aliases = {"l"}, - clazz = BiomeLocateCommand.class - ) + @Subcommand(value = "info", aliases = "i", clazz = BiomeInfoCommand.class), + @Subcommand(value = "locate", aliases = "l", clazz = BiomeLocateCommand.class) }, usage = "/terra biome" ) @@ -32,11 +25,11 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class BiomeCommand implements CommandTemplate { @Inject private TerraPlugin main; - + @Override public void execute(CommandSender sender) { Player player = (Player) sender; - + BiomeProvider provider = player.world().getBiomeProvider(); UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(player.position(), player.world().getSeed()); sender.sendMessage("You are standing in " + biome.getID()); diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java index 76d840cea..029c72aae 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeInfoCommand.java @@ -11,27 +11,24 @@ import com.dfsek.terra.api.command.annotation.inject.ArgumentTarget; import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.world.biome.TerraBiome; -@Command( - arguments = { - @Argument( - value = "biome", - tabCompleter = BiomeTabCompleter.class, - argumentParser = BiomeArgumentParser.class - ) - } -) + +@Command(arguments = @Argument( + value = "biome", + tabCompleter = BiomeTabCompleter.class, + argumentParser = BiomeArgumentParser.class +)) public class BiomeInfoCommand implements CommandTemplate { @ArgumentTarget("biome") private TerraBiome biome; - + @Override public void execute(CommandSender sender) { sender.sendMessage("Biome info for \"" + biome.getID() + "\"."); sender.sendMessage("Vanilla biome: " + biome.getVanillaBiomes()); - + if(biome instanceof UserDefinedBiome) { BiomeTemplate bio = ((UserDefinedBiome) biome).getConfig(); - + if(bio.getExtended().size() == 0) { sender.sendMessage("No Parent Biomes"); } else { diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeLocateCommand.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeLocateCommand.java index 5e46575f3..79ecb290a 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeLocateCommand.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeLocateCommand.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.biome.command.biome; +import java.util.Locale; + import com.dfsek.terra.addons.biome.command.biome.arg.BiomeArgumentParser; import com.dfsek.terra.addons.biome.command.biome.tab.BiomeTabCompleter; import com.dfsek.terra.api.TerraPlugin; @@ -18,58 +20,58 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.Locale; @PlayerCommand @WorldCommand -@Command( - arguments = { - @Argument( - value = "biome", - tabCompleter = BiomeTabCompleter.class, - argumentParser = BiomeArgumentParser.class - ), - @Argument( - value = "radius", - required = false, - defaultValue = "1000", - argumentParser = IntegerArgumentParser.class - ) - }, - switches = { - @Switch( - value = "teleport", - aliases = {"t", "tp"} - ) - } -) +@Command(arguments = { + @Argument( + value = "biome", + tabCompleter = BiomeTabCompleter.class, + argumentParser = BiomeArgumentParser.class + ), + @Argument( + value = "radius", + required = false, + defaultValue = "1000", + argumentParser = IntegerArgumentParser.class + ) +}, switches = @Switch( + value = "teleport", + aliases = { "t", "tp" } +)) public class BiomeLocateCommand implements CommandTemplate { - + @ArgumentTarget("radius") private Integer radius; - + @ArgumentTarget("biome") private TerraBiome biome; - + @SwitchTarget("teleport") private boolean teleport; - + @Inject private TerraPlugin main; - + @Override public void execute(CommandSender sender) { - + Player player = (Player) sender; - - new Thread(new AsyncBiomeFinder(player.world().getBiomeProvider(), biome, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> { + + new Thread(new AsyncBiomeFinder(player.world().getBiomeProvider(), biome, + player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), + player.world(), 0, radius, location -> { if(location != null) { - sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", biome.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position()))); + sender.sendMessage( + String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", biome.getID().toLowerCase(Locale.ROOT), + location.getBlockX(), location.getBlockZ(), + location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position()))); if(teleport) { - main.runPossiblyUnsafeTask(() -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ()))); + main.runPossiblyUnsafeTask( + () -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ()))); } } else sender.sendMessage("Unable to locate biome \"" + biome.getID() + "\""); }, main), "Biome Location Thread").start(); - + } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java index 065a4eef8..9370ce76d 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/arg/BiomeArgumentParser.java @@ -7,10 +7,11 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.world.biome.TerraBiome; + public class BiomeArgumentParser implements ArgumentParser { @Inject private TerraPlugin main; - + @Override public TerraBiome parse(CommandSender sender, String arg) { Player player = (Player) sender; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/tab/BiomeTabCompleter.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/tab/BiomeTabCompleter.java index c0338ddbf..e1ceb9f58 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/tab/BiomeTabCompleter.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/tab/BiomeTabCompleter.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.biome.command.biome.tab; +import java.util.List; +import java.util.stream.Collectors; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.entity.CommandSender; @@ -7,16 +10,15 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.world.biome.TerraBiome; -import java.util.List; -import java.util.stream.Collectors; public class BiomeTabCompleter implements TabCompleter { @Inject private TerraPlugin main; - + @Override public List complete(CommandSender sender) { Player player = (Player) sender; - return player.world().getConfig().getRegistry(TerraBiome.class).entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); + return player.world().getConfig().getRegistry(TerraBiome.class).entries().stream().map(TerraBiome::getID).collect( + Collectors.toList()); } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java index 7b0a76b01..ca16479df 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolder.java @@ -2,21 +2,22 @@ package com.dfsek.terra.addons.biome.holder; import com.dfsek.terra.api.world.generator.Palette; + public class PaletteHolder { private final Palette[] palettes; private final int offset; - + protected PaletteHolder(Palette[] palettes, int offset) { this.palettes = palettes; this.offset = offset; } - + public Palette getPalette(int y) { int index = y + offset; return index >= 0 - ? index < palettes.length - ? palettes[index] - : palettes[palettes.length - 1] - : palettes[0]; + ? index < palettes.length + ? palettes[index] + : palettes[palettes.length - 1] + : palettes[0]; } } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java index 8cf93760d..7ed5a7825 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderBuilder.java @@ -1,24 +1,26 @@ package com.dfsek.terra.addons.biome.holder; -import com.dfsek.terra.api.world.generator.Palette; import net.jafama.FastMath; import java.util.Map; import java.util.TreeMap; +import com.dfsek.terra.api.world.generator.Palette; + + public class PaletteHolderBuilder { private final TreeMap paletteMap = new TreeMap<>(); - + public PaletteHolderBuilder add(int y, Palette palette) { paletteMap.put(y, palette); return this; } - + public PaletteHolder build() { - + int min = FastMath.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0); int max = FastMath.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255); - + Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min]; for(int y = min; y <= FastMath.max(paletteMap.lastKey(), max); y++) { Palette d = null; diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderLoader.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderLoader.java index 332c0bb44..3effd7037 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderLoader.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/holder/PaletteHolderLoader.java @@ -3,13 +3,14 @@ package com.dfsek.terra.addons.biome.holder; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.world.generator.Palette; import java.lang.reflect.AnnotatedType; -import java.lang.reflect.Type; import java.util.List; import java.util.Map; +import com.dfsek.terra.api.world.generator.Palette; + + public class PaletteHolderLoader implements TypeLoader { @SuppressWarnings("unchecked") @Override diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java index e5d1f2160..5b9794c90 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java @@ -1,13 +1,5 @@ package com.dfsek.terra.addons.carver; -import com.dfsek.terra.addons.carver.carving.Worm; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.util.MathUtil; -import com.dfsek.terra.api.util.PopulationUtil; -import com.dfsek.terra.api.vector.Vector3; -import com.dfsek.terra.api.world.World; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -18,43 +10,60 @@ import java.util.Collections; import java.util.List; import java.util.Random; -public class CarverCache { +import com.dfsek.terra.addons.carver.carving.Worm; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.util.MathUtil; +import com.dfsek.terra.api.util.PopulationUtil; +import com.dfsek.terra.api.vector.Vector3; +import com.dfsek.terra.api.world.World; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + +public class CarverCache { + private final LoadingCache> cache; private final UserDefinedCarver carver; - + public CarverCache(World w, TerraPlugin main, UserDefinedCarver carver) { this.carver = carver; cache = CacheBuilder.newBuilder().maximumSize(main.getTerraConfig().getCarverCacheSize()) - .build(new CacheLoader<>() { - @Override - public List load(@NotNull Long key) { - int chunkX = (int) (key >> 32); - int chunkZ = (int) key.longValue(); - BiomeProvider provider = w.getBiomeProvider(); - if(CarverCache.this.carver.isChunkCarved(w, chunkX, chunkZ, new Random(PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + CarverCache.this.carver.hashCode())))) { - long seed = PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); - Random r = new Random(seed); - Worm carving = CarverCache.this.carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), CarverCache.this.carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16))); - List points = new ArrayList<>(); - for(int i = 0; i < carving.getLength(); i++) { - carving.step(); - TerraBiome biome = provider.getBiome(carving.getRunning(), w.getSeed()); + .build(new CacheLoader<>() { + @Override + public List load(@NotNull Long key) { + int chunkX = (int) (key >> 32); + int chunkZ = (int) key.longValue(); + BiomeProvider provider = w.getBiomeProvider(); + if(CarverCache.this.carver.isChunkCarved(w, chunkX, chunkZ, new Random( + PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, + w.getSeed() + CarverCache.this.carver.hashCode())))) { + long seed = PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); + Random r = new Random(seed); + Worm carving = CarverCache.this.carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), + CarverCache.this.carver.getConfig() + .getHeight() + .get(r), + (chunkZ << 4) + r.nextInt(16))); + List points = new ArrayList<>(); + for(int i = 0; i < carving.getLength(); i++) { + carving.step(); + TerraBiome biome = provider.getBiome(carving.getRunning(), w.getSeed()); /* - if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(CarverCache.this.carver)) { // Stop if we enter a biome this carver is not present in + if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(CarverCache.this.carver)) { // Stop + if we enter a biome this carver is not present in return Collections.emptyList(); } */ - points.add(carving.getPoint()); - } - return points; - } - return Collections.emptyList(); - } - }); + points.add(carving.getPoint()); + } + return points; + } + return Collections.emptyList(); + } + }); } - + public List getPoints(int chunkX, int chunkZ) { return cache.getUnchecked(MathUtil.squash(chunkX, chunkZ)); } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverFactory.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverFactory.java index 47a64eb2b..32cba0c18 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverFactory.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverFactory.java @@ -3,30 +3,33 @@ package com.dfsek.terra.addons.carver; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.tectonic.exception.LoadException; + +import java.util.Arrays; +import java.util.List; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.util.MathUtil; -import java.util.Arrays; -import java.util.List; public class CarverFactory implements ConfigFactory { private final ConfigPack pack; - + public CarverFactory(ConfigPack pack) { this.pack = pack; } - + @Override public UserDefinedCarver build(CarverTemplate config, TerraPlugin main) throws LoadException { - double[] start = new double[] {config.getStartX(), config.getStartY(), config.getStartZ()}; - double[] mutate = new double[] {config.getMutateX(), config.getMutateY(), config.getMutateZ()}; + double[] start = { config.getStartX(), config.getStartY(), config.getStartZ() }; + double[] mutate = { config.getMutateX(), config.getMutateY(), config.getMutateZ() }; List radius = Arrays.asList(config.getRadMX(), config.getRadMY(), config.getRadMZ()); long hash = MathUtil.hashToLong(config.getID()); UserDefinedCarver carver; try { - carver = new UserDefinedCarver(config.getHeight(), config.getLength(), start, mutate, radius, new Scope(), hash, config.getCutTop(), config.getCutBottom(), config, main); + carver = new UserDefinedCarver(config.getHeight(), config.getLength(), start, mutate, radius, new Scope(), hash, + config.getCutTop(), config.getCutBottom(), config, main); } catch(ParseException e) { throw new LoadException("Unable to parse radius equations", e); } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverPalette.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverPalette.java index 6ebf2f49a..8920ebff8 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverPalette.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverPalette.java @@ -1,52 +1,54 @@ package com.dfsek.terra.addons.carver; -import com.dfsek.terra.api.block.BlockType; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.collection.MaterialSet; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; import net.jafama.FastMath; import java.util.Map; import java.util.TreeMap; -@SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; + + +@SuppressWarnings({ "unchecked", "rawtypes", "RedundantSuppression" }) public class CarverPalette { private final boolean blacklist; private final MaterialSet replace; private final TreeMap> map = new TreeMap<>(); private ProbabilityCollection[] layers; private int offset = 0; - + public CarverPalette(MaterialSet replaceable, boolean blacklist) { this.blacklist = blacklist; this.replace = replaceable; } - + public CarverPalette add(ProbabilityCollection collection, int y) { map.put(y, collection); return this; } - + public ProbabilityCollection get(int y) { int index = y + offset; return index >= 0 - ? index < layers.length - ? layers[index] - : layers[layers.length - 1] - : layers[0]; + ? index < layers.length + ? layers[index] + : layers[layers.length - 1] + : layers[0]; } - + public boolean canReplace(BlockType material) { return blacklist != replace.contains(material); } - + /** * Build the palette to an array. */ public void build() { int min = FastMath.min(map.keySet().stream().min(Integer::compareTo).orElse(0), 0); int max = FastMath.max(map.keySet().stream().max(Integer::compareTo).orElse(255), 255); - + layers = new ProbabilityCollection[map.lastKey() + 1 - min]; for(int y = min; y <= FastMath.max(map.lastKey(), max); y++) { ProbabilityCollection d = null; diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverTemplate.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverTemplate.java index 1ae81d0e2..b1f20f6f3 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverTemplate.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverTemplate.java @@ -4,6 +4,10 @@ package com.dfsek.terra.addons.carver; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; + +import java.util.HashMap; +import java.util.Map; + import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; @@ -11,176 +15,174 @@ import com.dfsek.terra.api.util.ConstantRange; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; -import java.util.HashMap; -import java.util.Map; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class CarverTemplate implements AbstractableTemplate { @Value("id") @Final private String id; - + @Value("step") @Default private @Meta int step = 2; - + @Value("recalculate-magnitude") @Default private @Meta double recaclulateMagnitude = 4; - + @Value("recalculate-direction") @Default private @Meta Range recalc = new ConstantRange(8, 10); - + @Value("length") private @Meta Range length; - + @Value("start.x") private @Meta double startX; - + @Value("start.y") private @Meta double startY; - + @Value("start.z") private @Meta double startZ; - + @Value("start.radius.x") private @Meta String radMX; - + @Value("start.radius.y") private @Meta String radMY; - + @Value("start.radius.z") private @Meta String radMZ; - + @Value("start.height") private @Meta Range height; - + @Value("cut.bottom") @Default private @Meta int cutBottom = 0; - + @Value("cut.top") @Default private @Meta int cutTop = 0; - + @Value("mutate.x") private @Meta double mutateX; - + @Value("mutate.y") private @Meta double mutateY; - + @Value("mutate.z") private @Meta double mutateZ; - + @Value("palette.top") private @Meta CarverPalette top; - + @Value("palette.bottom") private @Meta CarverPalette bottom; - + @Value("palette.outer") private @Meta CarverPalette outer; - + @Value("palette.inner") private @Meta CarverPalette inner; - + @Value("shift") @Default private @Meta Map<@Meta BlockType, @Meta MaterialSet> shift = new HashMap<>(); - + @Value("update") @Default private @Meta MaterialSet update = new MaterialSet(); - + public String getID() { return id; } - + public int getStep() { return step; } - + public Range getLength() { return length; } - + public double getStartX() { return startX; } - + public double getStartY() { return startY; } - + public double getStartZ() { return startZ; } - + public String getRadMX() { return radMX; } - + public String getRadMY() { return radMY; } - + public String getRadMZ() { return radMZ; } - + public Range getHeight() { return height; } - + public int getCutBottom() { return cutBottom; } - + public int getCutTop() { return cutTop; } - + public double getMutateX() { return mutateX; } - + public double getMutateY() { return mutateY; } - + public double getMutateZ() { return mutateZ; } - + public CarverPalette getTop() { return top; } - + public CarverPalette getBottom() { return bottom; } - + public CarverPalette getOuter() { return outer; } - + public CarverPalette getInner() { return inner; } - + public Map getShift() { return shift; } - + public MaterialSet getUpdate() { return update; } - + public Range getRecalc() { return recalc; } - + public double getRecaclulateMagnitude() { return recaclulateMagnitude; } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CavePopulator.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CavePopulator.java index bf9398586..8380421ac 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CavePopulator.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CavePopulator.java @@ -1,5 +1,11 @@ package com.dfsek.terra.addons.carver; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; @@ -11,20 +17,17 @@ import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.generator.Chunkified; import com.dfsek.terra.api.world.generator.GenerationStage; -import org.jetbrains.annotations.NotNull; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; public class CavePopulator implements GenerationStage, Chunkified { - private static final Map shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time. + private static final Map shiftStorage = new HashMap<>(); + // Persist BlockData created for shifts, to avoid re-calculating each time. private final TerraPlugin main; - + public CavePopulator(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { @@ -32,7 +35,7 @@ public class CavePopulator implements GenerationStage, Chunkified { Random random = PopulationUtil.getRandom(chunk); WorldConfig config = world.getConfig(); if(config.disableCarving()) return; - + for(UserDefinedCarver c : config.getRegistry(UserDefinedCarver.class).entries()) { CarverTemplate template = c.getConfig(); Map shiftCandidate = new HashMap<>(); @@ -43,25 +46,29 @@ public class CavePopulator implements GenerationStage, Chunkified { switch(type) { case CENTER: if(template.getInner().canReplace(re)) { - chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), template.getInner().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); + chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), + template.getInner().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); if(template.getShift().containsKey(re)) shiftCandidate.put(v, m); } break; case WALL: if(template.getOuter().canReplace(re)) { - chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), template.getOuter().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); + chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), + template.getOuter().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); if(template.getShift().containsKey(re)) shiftCandidate.put(v, m); } break; case TOP: if(template.getTop().canReplace(re)) { - chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), template.getTop().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); + chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), + template.getTop().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); if(template.getShift().containsKey(re)) shiftCandidate.put(v, m); } break; case BOTTOM: if(template.getBottom().canReplace(re)) { - chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), template.getBottom().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); + chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), + template.getBottom().get(v.getBlockY()).get(random), template.getUpdate().contains(re)); if(template.getShift().containsKey(re)) shiftCandidate.put(v, m); } break; @@ -73,16 +80,19 @@ public class CavePopulator implements GenerationStage, Chunkified { Vector3 mut = l.clone(); BlockState orig = chunk.getBlock(l.getBlockX(), l.getBlockY(), l.getBlockZ()); do mut.subtract(0, 1, 0); - while(mut.getY() > world.getMinHeight() && chunk.getBlock(mut.getBlockX(), mut.getBlockY(), mut.getBlockZ()).matches(orig)); + while(mut.getY() > world.getMinHeight() && chunk.getBlock(mut.getBlockX(), mut.getBlockY(), mut.getBlockZ()).matches( + orig)); try { - if(template.getShift().get(entry.getValue().getBlockType()).contains(chunk.getBlock(mut.getBlockX(), mut.getBlockY(), mut.getBlockZ()).getBlockType())) { - chunk.setBlock(mut.getBlockX(), mut.getBlockY(), mut.getBlockZ(), shiftStorage.computeIfAbsent(entry.getValue().getBlockType(), BlockType::getDefaultData), false); + if(template.getShift().get(entry.getValue().getBlockType()).contains( + chunk.getBlock(mut.getBlockX(), mut.getBlockY(), mut.getBlockZ()).getBlockType())) { + chunk.setBlock(mut.getBlockX(), mut.getBlockY(), mut.getBlockZ(), + shiftStorage.computeIfAbsent(entry.getValue().getBlockType(), BlockType::getDefaultData), false); } } catch(NullPointerException ignored) { } } } - + } } } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/UserDefinedCarver.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/UserDefinedCarver.java index 7270e4f53..6d62b4fa7 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/UserDefinedCarver.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/UserDefinedCarver.java @@ -4,13 +4,6 @@ import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; -import com.dfsek.terra.addons.carver.carving.Carver; -import com.dfsek.terra.addons.carver.carving.Worm; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.util.ConstantRange; -import com.dfsek.terra.api.util.Range; -import com.dfsek.terra.api.vector.Vector3; -import com.dfsek.terra.api.world.World; import net.jafama.FastMath; import java.util.List; @@ -19,6 +12,15 @@ import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; +import com.dfsek.terra.addons.carver.carving.Carver; +import com.dfsek.terra.addons.carver.carving.Worm; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.util.ConstantRange; +import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.vector.Vector3; +import com.dfsek.terra.api.world.World; + + public class UserDefinedCarver extends Carver { private final double[] start; // 0, 1, 2 = x, y, z. private final double[] mutate; // 0, 1, 2 = x, y, z. 3 = radius. @@ -30,14 +32,15 @@ public class UserDefinedCarver extends Carver { private final Expression xRad; private final Expression yRad; private final Expression zRad; - + private final Map cacheMap = new ConcurrentHashMap<>(); private final TerraPlugin main; private double step = 2; private Range recalc = new ConstantRange(8, 10); private double recalcMagnitude = 3; - - public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, TerraPlugin main) throws ParseException { + + public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List radii, Scope parent, long hash, + int topCut, int bottomCut, CarverTemplate config, TerraPlugin main) throws ParseException { super(height.getMin(), height.getMax()); this.length = length; this.start = start; @@ -47,41 +50,27 @@ public class UserDefinedCarver extends Carver { this.bottomCut = bottomCut; this.config = config; this.main = main; - + Parser p = new Parser(); - + Scope s = new Scope().withParent(parent); - - + + s.addInvocationVariable("x"); s.addInvocationVariable("y"); s.addInvocationVariable("z"); - + s.addInvocationVariable("length"); s.addInvocationVariable("position"); s.addInvocationVariable("seed"); - - + + xRad = p.parse(radii.get(0), s); yRad = p.parse(radii.get(1), s); zRad = p.parse(radii.get(2), s); - + } - - @Override - public Worm getWorm(long l, Vector3 vector) { - Random r = new Random(l + hash); - return new UserDefinedWorm(length.get(r) / 2, r, vector, topCut, bottomCut, l); - } - - public void setStep(double step) { - this.step = step; - } - - public void setRecalc(Range recalc) { - this.recalc = recalc; - } - + @Override public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { synchronized(cacheMap) { @@ -91,7 +80,8 @@ public class UserDefinedCarver extends Carver { for(int z = chunkZ - carvingRadius; z <= chunkZ + carvingRadius; z++) { cache.getPoints(x, z).forEach(point -> { Vector3 origin = point.getOrigin(); - if(FastMath.floorDiv(origin.getBlockX(), 16) != chunkX && FastMath.floorDiv(origin.getBlockZ(), 16) != chunkZ) // We only want to carve this chunk. + if(FastMath.floorDiv(origin.getBlockX(), 16) != chunkX && FastMath.floorDiv(origin.getBlockZ(), 16) != + chunkZ) // We only want to carve this chunk. return; point.carve(chunkX, chunkZ, consumer, w); }); @@ -99,24 +89,39 @@ public class UserDefinedCarver extends Carver { } } } - - public void setRecalcMagnitude(double recalcMagnitude) { - this.recalcMagnitude = recalcMagnitude; + + @Override + public Worm getWorm(long l, Vector3 vector) { + Random r = new Random(l + hash); + return new UserDefinedWorm(length.get(r) / 2, r, vector, topCut, bottomCut, l); } - + @Override public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) { - /*BiomeTemplate conf = ((UserDefinedBiome) main.getWorld(w).getBiomeProvider().getBiome((chunkX << 4) + 8, (chunkZ << 4) + 8)).getConfig(); + /*BiomeTemplate conf = ((UserDefinedBiome) main.getWorld(w).getBiomeProvider().getBiome((chunkX << 4) + 8, (chunkZ << 4) + 8)) + .getConfig(); if(conf.getCarvers().get(this) != null) { return new Random(random.nextLong() + hash).nextInt(100) < conf.getCarvers().get(this); }*/ return false; } - + + public void setRecalc(Range recalc) { + this.recalc = recalc; + } + + public void setRecalcMagnitude(double recalcMagnitude) { + this.recalcMagnitude = recalcMagnitude; + } + + public void setStep(double step) { + this.step = step; + } + public CarverTemplate getConfig() { return config; } - + private class UserDefinedWorm extends Worm { private final Vector3 direction; private final Vector3 origin; @@ -124,41 +129,44 @@ public class UserDefinedCarver extends Carver { private int steps; private int nextDirection = 0; private double[] currentRotation = new double[3]; - + public UserDefinedWorm(int length, Random r, Vector3 origin, int topCut, int bottomCut, long seed) { super(length, r, origin); this.origin = origin; this.seed = seed; super.setTopCut(topCut); super.setBottomCut(bottomCut); - direction = new Vector3((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step); - double[] args = {origin.getX(), origin.getY(), origin.getZ(), length, 0, seed}; - setRadius(new int[] {(int) (xRad.evaluate(args)), (int) (yRad.evaluate(args)), (int) (zRad.evaluate(args))}); + direction = new Vector3((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], + (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step); + double[] args = { origin.getX(), origin.getY(), origin.getZ(), length, 0, seed }; + setRadius(new int[]{ (int) (xRad.evaluate(args)), (int) (yRad.evaluate(args)), (int) (zRad.evaluate(args)) }); } - - @Override - public WormPoint getPoint() { - return new WormPoint(getRunning().clone(), getRadius(), config.getCutTop(), config.getCutBottom()); - } - + @Override public void step() { if(steps == nextDirection) { direction.rotateAroundX(FastMath.toRadians((getRandom().nextGaussian()) * mutate[0] * recalcMagnitude)); direction.rotateAroundY(FastMath.toRadians((getRandom().nextGaussian()) * mutate[1] * recalcMagnitude)); direction.rotateAroundZ(FastMath.toRadians((getRandom().nextGaussian()) * mutate[2] * recalcMagnitude)); - currentRotation = new double[] {(getRandom().nextGaussian()) * mutate[0], + currentRotation = new double[]{ + (getRandom().nextGaussian()) * mutate[0], (getRandom().nextGaussian()) * mutate[1], - (getRandom().nextGaussian()) * mutate[2]}; + (getRandom().nextGaussian()) * mutate[2] + }; nextDirection += recalc.get(getRandom()); } steps++; - double[] args = {origin.getX(), origin.getY(), origin.getZ(), getLength(), steps, seed}; - setRadius(new int[] {(int) (xRad.evaluate(args)), (int) (yRad.evaluate(args)), (int) (zRad.evaluate(args))}); + double[] args = { origin.getX(), origin.getY(), origin.getZ(), getLength(), steps, seed }; + setRadius(new int[]{ (int) (xRad.evaluate(args)), (int) (yRad.evaluate(args)), (int) (zRad.evaluate(args)) }); direction.rotateAroundX(FastMath.toRadians(currentRotation[0] * mutate[0])); direction.rotateAroundY(FastMath.toRadians(currentRotation[1] * mutate[1])); direction.rotateAroundZ(FastMath.toRadians(currentRotation[2] * mutate[2])); getRunning().add(direction); } + + @Override + public WormPoint getPoint() { + return new WormPoint(getRunning().clone(), getRadius(), config.getCutTop(), config.getCutBottom()); + } } } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Carver.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Carver.java index 3759ff174..15f4687c2 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Carver.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Carver.java @@ -1,38 +1,43 @@ package com.dfsek.terra.addons.carver.carving; -import com.dfsek.terra.api.vector.Vector3; -import com.dfsek.terra.api.world.World; import net.jafama.FastMath; import java.util.Random; import java.util.function.BiConsumer; +import com.dfsek.terra.api.vector.Vector3; +import com.dfsek.terra.api.world.World; + + public abstract class Carver { private final int minY; private final int maxY; private final double sixtyFourSq = FastMath.pow(64, 2); private int carvingRadius = 4; - + public Carver(int minY, int maxY) { this.minY = minY; this.maxY = maxY; } - + public abstract void carve(int chunkX, int chunkZ, World w, BiConsumer consumer); - + public int getCarvingRadius() { return carvingRadius; } - + public void setCarvingRadius(int carvingRadius) { this.carvingRadius = carvingRadius; } - + public abstract Worm getWorm(long seed, Vector3 l); - + public abstract boolean isChunkCarved(World w, int chunkX, int chunkZ, Random r); - + public enum CarvingType { - CENTER, WALL, TOP, BOTTOM + CENTER, + WALL, + TOP, + BOTTOM } } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Worm.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Worm.java index 00d1fc0f2..727bce285 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Worm.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/carving/Worm.java @@ -1,12 +1,14 @@ package com.dfsek.terra.addons.carver.carving; -import com.dfsek.terra.api.vector.Vector3; -import com.dfsek.terra.api.world.World; import net.jafama.FastMath; import java.util.Random; import java.util.function.BiConsumer; +import com.dfsek.terra.api.vector.Vector3; +import com.dfsek.terra.api.world.World; + + public abstract class Worm { private final Random r; private final Vector3 origin; @@ -14,78 +16,73 @@ public abstract class Worm { private final int length; private int topCut = 0; private int bottomCut = 0; - private int[] radius = new int[] {0, 0, 0}; - + private int[] radius = { 0, 0, 0 }; + public Worm(int length, Random r, Vector3 origin) { this.r = r; this.length = length; this.origin = origin; this.running = origin; } - + + public abstract void step(); + public void setBottomCut(int bottomCut) { this.bottomCut = bottomCut; } - + public void setTopCut(int topCut) { this.topCut = topCut; } - + public Vector3 getOrigin() { return origin; } - + public int getLength() { return length; } - + public Vector3 getRunning() { return running; } - + public WormPoint getPoint() { return new WormPoint(running, radius, topCut, bottomCut); } - + public int[] getRadius() { return radius; } - + public void setRadius(int[] radius) { this.radius = radius; } - + public Random getRandom() { return r; } - - public abstract void step(); - + + public static class WormPoint { private final Vector3 origin; private final int topCut; private final int bottomCut; private final int[] rad; - + public WormPoint(Vector3 origin, int[] rad, int topCut, int bottomCut) { this.origin = origin; this.rad = rad; this.topCut = topCut; this.bottomCut = bottomCut; } - + private static double ellipseEquation(int x, int y, int z, double xr, double yr, double zr) { - return (FastMath.pow2(x) / FastMath.pow2(xr + 0.5D)) + (FastMath.pow2(y) / FastMath.pow2(yr + 0.5D)) + (FastMath.pow2(z) / FastMath.pow2(zr + 0.5D)); + return (FastMath.pow2(x) / FastMath.pow2(xr + 0.5D)) + (FastMath.pow2(y) / FastMath.pow2(yr + 0.5D)) + (FastMath.pow2(z) / + FastMath.pow2( + zr + 0.5D)); } - - public Vector3 getOrigin() { - return origin; - } - - public int getRadius(int index) { - return rad[index]; - } - + public void carve(int chunkX, int chunkZ, BiConsumer consumer, World world) { int xRad = getRadius(0); int yRad = getRadius(1); @@ -101,8 +98,10 @@ public abstract class Worm { if(position.getY() < world.getMinHeight() || position.getY() > world.getMaxHeight()) continue; double eq = ellipseEquation(x, y, z, xRad, yRad, zRad); if(eq <= 1 && - y >= -yRad - 1 + bottomCut && y <= yRad + 1 - topCut) { - consumer.accept(new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), Carver.CarvingType.CENTER); + y >= -yRad - 1 + bottomCut && y <= yRad + 1 - topCut) { + consumer.accept( + new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), + Carver.CarvingType.CENTER); } else if(eq <= 1.5) { Carver.CarvingType type = Carver.CarvingType.WALL; if(y <= -yRad - 1 + bottomCut) { @@ -110,11 +109,21 @@ public abstract class Worm { } else if(y >= yRad + 1 - topCut) { type = Carver.CarvingType.TOP; } - consumer.accept(new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), type); + consumer.accept( + new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), + type); } } } } } + + public Vector3 getOrigin() { + return origin; + } + + public int getRadius(int index) { + return rad[index]; + } } } diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java index 07fb8295c..6c4538fb8 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -1,6 +1,9 @@ package com.dfsek.terra.addons.feature.distributor; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + import com.dfsek.terra.addons.feature.distributor.config.AndDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.NoiseDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.OrDistributorTemplate; @@ -19,31 +22,32 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.function.Supplier; @Addon("config-distributors") @Version("1.0.0") @Author("Terra") public class DistributorAddon extends TerraAddon { - public static final TypeKey>> DISTRIBUTOR_TOKEN = new TypeKey<>() {}; + public static final TypeKey>> DISTRIBUTOR_TOKEN = new TypeKey<>() { + }; @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> distributorRegistry = event.getPack().getOrCreateRegistry(DISTRIBUTOR_TOKEN); - distributorRegistry.register("NOISE", NoiseDistributorTemplate::new); - distributorRegistry.register("POINTS", PointSetDistributorTemplate::new); - distributorRegistry.register("AND", AndDistributorTemplate::new); - distributorRegistry.register("OR", OrDistributorTemplate::new); - - event.getPack() - .applyLoader(Point.class, PointTemplate::new); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> distributorRegistry = event.getPack().getOrCreateRegistry( + DISTRIBUTOR_TOKEN); + distributorRegistry.register("NOISE", NoiseDistributorTemplate::new); + distributorRegistry.register("POINTS", PointSetDistributorTemplate::new); + distributorRegistry.register("AND", AndDistributorTemplate::new); + distributorRegistry.register("OR", OrDistributorTemplate::new); + + event.getPack() + .applyLoader(Point.class, PointTemplate::new); + }) + .failThrough(); } } diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java index cbc0c1ba5..55d973f3f 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java @@ -4,16 +4,18 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Distributor; -import java.util.List; public class AndDistributorTemplate implements ObjectTemplate, ValidatedConfigTemplate { @Value("distributors") private @Meta List<@Meta Distributor> distributors; - - + + @Override public Distributor get() { Distributor current = distributors.remove(0); @@ -22,7 +24,7 @@ public class AndDistributorTemplate implements ObjectTemplate, Vali } return current; } - + @Override public boolean validate() throws ValidationException { if(distributors.isEmpty()) throw new ValidationException("AND Distributor must specify at least 1 distributor."); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java index 1982d71b2..67cf37ee9 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java @@ -3,19 +3,20 @@ package com.dfsek.terra.addons.feature.distributor.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.feature.distributor.distributors.NoiseDistributor; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.Distributor; -public class NoiseDistributorTemplate implements ObjectTemplate { - @Value("distribution") - private @Meta NoiseSampler noise; +public class NoiseDistributorTemplate implements ObjectTemplate { @Value("threshold") @Default - private @Meta double threshold = 0; - + private final @Meta double threshold = 0; + @Value("distribution") + private @Meta NoiseSampler noise; + @Override public Distributor get() { return new NoiseDistributor(noise, threshold); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java index 292ebffbe..3a8aa26c3 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java @@ -4,16 +4,18 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Distributor; -import java.util.List; public class OrDistributorTemplate implements ObjectTemplate, ValidatedConfigTemplate { @Value("distributors") private @Meta List<@Meta Distributor> distributors; - - + + @Override public Distributor get() { Distributor current = distributors.remove(0); @@ -22,7 +24,7 @@ public class OrDistributorTemplate implements ObjectTemplate, Valid } return current; } - + @Override public boolean validate() throws ValidationException { if(distributors.isEmpty()) throw new ValidationException("AND Distributor must specify at least 1 distributor."); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java index 5def1904b..da61112a7 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java @@ -2,17 +2,19 @@ package com.dfsek.terra.addons.feature.distributor.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.Set; + import com.dfsek.terra.addons.feature.distributor.distributors.PointSetDistributor; import com.dfsek.terra.addons.feature.distributor.util.Point; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Distributor; -import java.util.Set; public class PointSetDistributorTemplate implements ObjectTemplate { @Value("points") private @Meta Set<@Meta Point> points; - + @Override public Distributor get() { return new PointSetDistributor(points); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java index 876beb2aa..8303c2288 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java @@ -3,15 +3,17 @@ package com.dfsek.terra.addons.feature.distributor.distributors; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.Distributor; + public class NoiseDistributor implements Distributor { private final NoiseSampler sampler; - + private final double threshold; + public NoiseDistributor(NoiseSampler sampler, double threshold) { this.sampler = sampler; this.threshold = threshold; } - + @Override public boolean matches(int x, int z, long seed) { return sampler.getNoiseSeeded(seed, x, z) > threshold; diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java index 78f514513..5508ebe8f 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java @@ -1,17 +1,18 @@ package com.dfsek.terra.addons.feature.distributor.distributors; +import java.util.Set; + import com.dfsek.terra.addons.feature.distributor.util.Point; import com.dfsek.terra.api.structure.feature.Distributor; -import java.util.Set; public class PointSetDistributor implements Distributor { private final Set points; - + public PointSetDistributor(Set points) { this.points = points; } - + @Override public boolean matches(int x, int z, long seed) { return points.contains(new Point(x, z)); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java index cd7063db2..973f1c8d1 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java @@ -3,28 +3,28 @@ package com.dfsek.terra.addons.feature.distributor.util; public class Point { private final int x; private final int z; - + private final int hash; - + public Point(int x, int z) { this.x = x; this.z = z; this.hash = 31 * x + z; } - + public int getX() { return x; } - + public int getZ() { return z; } - + @Override public int hashCode() { return hash; } - + @Override public boolean equals(Object obj) { if(!(obj instanceof Point)) return false; diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java index cd208a059..864b5168f 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java @@ -2,15 +2,17 @@ package com.dfsek.terra.addons.feature.distributor.util; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.api.config.meta.Meta; + public class PointTemplate implements ObjectTemplate { @Value("x") private @Meta int x; - + @Value("z") private @Meta int z; - + @Override public Point get() { return new Point(x, z); diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java index c3c5cae2d..8fe4eab9e 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java @@ -8,30 +8,32 @@ import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.World; + public class ConfiguredFeature implements Feature { private final ProbabilityCollection structures; - + private final NoiseSampler structureSelector; private final Distributor distributor; private final Locator locator; - - public ConfiguredFeature(ProbabilityCollection structures, NoiseSampler structureSelector, Distributor distributor, Locator locator) { + + public ConfiguredFeature(ProbabilityCollection structures, NoiseSampler structureSelector, Distributor distributor, + Locator locator) { this.structures = structures; this.structureSelector = structureSelector; this.distributor = distributor; this.locator = locator; } - + @Override public Structure getStructure(World world, int x, int y, int z) { return structures.get(structureSelector, x, y, z, world.getSeed()); } - + @Override public Distributor getDistributor() { return distributor; } - + @Override public Locator getLocator() { return locator; diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java index 871476727..da464a4c6 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java @@ -9,19 +9,20 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.injection.annotations.Inject; + @Addon("config-feature") @Version("1.0.0") @Author("Terra") public class FeatureAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack().registerConfigType(new FeatureConfigType(), "FEATURE", 2)) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack().registerConfigType(new FeatureConfigType(), "FEATURE", 2)) + .failThrough(); } } diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java index 7a02bd640..7ba0f5e86 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.feature; +import java.util.function.Supplier; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; @@ -8,30 +10,30 @@ import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.structure.feature.Feature; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.function.Supplier; public class FeatureConfigType implements ConfigType { - public static final TypeKey FEATURE_TYPE_KEY = new TypeKey<>() {}; - + public static final TypeKey FEATURE_TYPE_KEY = new TypeKey<>() { + }; + private final FeatureFactory factory = new FeatureFactory(); - - @Override - public FeatureTemplate getTemplate(ConfigPack pack, TerraPlugin main) { - return new FeatureTemplate(); - } - - @Override - public ConfigFactory getFactory() { - return factory; - } - - @Override - public TypeKey getTypeKey() { - return FEATURE_TYPE_KEY; - } - + @Override public Supplier> registrySupplier(ConfigPack pack) { return pack.getRegistryFactory()::create; } + + @Override + public FeatureTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new FeatureTemplate(); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeKey() { + return FEATURE_TYPE_KEY; + } } diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java index 83f07ecc5..121a196ec 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java @@ -1,10 +1,12 @@ package com.dfsek.terra.addons.feature; import com.dfsek.tectonic.exception.LoadException; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.structure.feature.Feature; + public class FeatureFactory implements ConfigFactory { @Override public Feature build(FeatureTemplate config, TerraPlugin main) throws LoadException { diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java index 7deaaa2fc..1357987a2 100644 --- a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java @@ -2,7 +2,7 @@ package com.dfsek.terra.addons.feature; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; + import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; @@ -11,40 +11,41 @@ import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.collection.ProbabilityCollection; + public class FeatureTemplate implements AbstractableTemplate { @Value("id") @Final private String id; - + @Value("distributor") private @Meta Distributor distributor; - + @Value("locator") private @Meta Locator locator; - + @Value("structures.distribution") private @Meta NoiseSampler structureNoise; - + @Value("structures.structures") private @Meta ProbabilityCollection structures; - + @Override public String getID() { return id; } - + public Distributor getDistributor() { return distributor; } - + public Locator getLocator() { return locator; } - + public NoiseSampler getStructureNoise() { return structureNoise; } - + public ProbabilityCollection getStructures() { return structures; } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java index e696ab249..8048e6595 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java @@ -11,22 +11,23 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.injection.annotations.Inject; + @Addon("config-flora") @Author("Terra") @Version("0.1.0") public class FloraAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - event.getPack().registerConfigType(new FloraConfigType(), "FLORA", 2); - event.getPack().applyLoader(BlockLayer.class, BlockLayerTemplate::new); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + event.getPack().registerConfigType(new FloraConfigType(), "FLORA", 2); + event.getPack().applyLoader(BlockLayer.class, BlockLayerTemplate::new); + }) + .failThrough(); } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java index c17a604ba..77c2eaf7c 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.flora; +import java.util.function.Supplier; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.config.ConfigPack; @@ -8,30 +10,29 @@ import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.Flora; -import java.util.function.Supplier; public class FloraConfigType implements ConfigType { + public static final TypeKey FLORA_TYPE_TOKEN = new TypeKey<>() { + }; private final FloraFactory factory = new FloraFactory(); - - public static final TypeKey FLORA_TYPE_TOKEN = new TypeKey<>(){}; - - @Override - public FloraTemplate getTemplate(ConfigPack pack, TerraPlugin main) { - return new FloraTemplate(); - } - - @Override - public ConfigFactory getFactory() { - return factory; - } - - @Override - public TypeKey getTypeKey() { - return FLORA_TYPE_TOKEN; - } - + @Override public Supplier> registrySupplier(ConfigPack pack) { return pack.getRegistryFactory()::create; } + + @Override + public FloraTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new FloraTemplate(); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeKey() { + return FLORA_TYPE_TOKEN; + } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java index e04f6cd0b..88b6ebcd9 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraFactory.java @@ -5,9 +5,12 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.world.Flora; + public class FloraFactory implements ConfigFactory { @Override public TerraFlora build(FloraTemplate config, TerraPlugin main) { - return new TerraFlora(config.getLayers(), config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main, config.getNoiseDistribution()); + return new TerraFlora(config.getLayers(), config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), + config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), + config.isSpawnBlacklist(), config.getIrrigableOffset(), main, config.getNoiseDistribution()); } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java index dad47d26b..f58d64341 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java @@ -3,6 +3,9 @@ package com.dfsek.terra.addons.flora; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; + +import java.util.List; + import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; import com.dfsek.terra.addons.flora.flora.gen.TerraFlora; import com.dfsek.terra.api.config.AbstractableTemplate; @@ -10,108 +13,107 @@ import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.MaterialSet; -import java.util.List; -@SuppressWarnings({"FieldMayBeFinal", "unused"}) +@SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class FloraTemplate implements AbstractableTemplate { @Value("id") @Final private String id; - + @Value("spawnable") private @Meta MaterialSet spawnable; - + @Value("spawn-blacklist") @Default private @Meta boolean spawnBlacklist = false; - - + + @Value("replaceable") @Default private @Meta MaterialSet replaceable = MaterialSet.empty(); - + @Value("irrigable") @Default - private @Meta MaterialSet irrigable = null; - + private @Meta MaterialSet irrigable; + @Value("rotatable") @Default private @Meta MaterialSet rotatable = MaterialSet.empty(); - + @Value("physics") @Default private @Meta boolean doPhysics = false; - + @Value("ceiling") @Default private @Meta boolean ceiling = false; - + @Value("search") @Default private TerraFlora.@Meta Search search = TerraFlora.Search.UP; - + @Value("max-placements") @Default private @Meta int maxPlacements = -1; - + @Value("irrigable-offset") @Default private @Meta int irrigableOffset; - + @Value("layers") private @Meta List<@Meta BlockLayer> layers; - + @Value("layer-distribution") private @Meta NoiseSampler noiseDistribution; - - public NoiseSampler getNoiseDistribution() { - return noiseDistribution; - } - - public List getLayers() { - return layers; - } - - public int getIrrigableOffset() { - return irrigableOffset; - } - - public TerraFlora.Search getSearch() { - return search; - } - - public int getMaxPlacements() { - return maxPlacements; - } - - public MaterialSet getReplaceable() { - return replaceable; - } - - public MaterialSet getSpawnable() { - return spawnable; - } - - public MaterialSet getIrrigable() { - return irrigable; - } - - public String getID() { - return id; - } - + public boolean doPhysics() { return doPhysics; } - + + public NoiseSampler getNoiseDistribution() { + return noiseDistribution; + } + + public List getLayers() { + return layers; + } + + public int getIrrigableOffset() { + return irrigableOffset; + } + + public TerraFlora.Search getSearch() { + return search; + } + + public int getMaxPlacements() { + return maxPlacements; + } + + public MaterialSet getReplaceable() { + return replaceable; + } + + public MaterialSet getSpawnable() { + return spawnable; + } + + public MaterialSet getIrrigable() { + return irrigable; + } + + public String getID() { + return id; + } + public boolean isCeiling() { return ceiling; } - + public boolean isSpawnBlacklist() { return spawnBlacklist; } - + public MaterialSet getRotatable() { return rotatable; } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java index 184a6fb3d..13673d93f 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/config/BlockLayerTemplate.java @@ -2,18 +2,20 @@ package com.dfsek.terra.addons.flora.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.collection.ProbabilityCollection; + public class BlockLayerTemplate implements ObjectTemplate { @Value("layers") private @Meta int layers; - + @Value("materials") private @Meta ProbabilityCollection data; - + @Override public BlockLayer get() { return new BlockLayer(layers, data); diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java index 7ebb1adcb..75b16529a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/BlockLayer.java @@ -3,19 +3,20 @@ package com.dfsek.terra.addons.flora.flora.gen; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.collection.ProbabilityCollection; + public class BlockLayer { private final int layers; private final ProbabilityCollection blocks; - + public BlockLayer(int layers, ProbabilityCollection blocks) { this.layers = layers; this.blocks = blocks; } - + public int getLayers() { return layers; } - + public ProbabilityCollection getBlocks() { return blocks; } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java index 6563f09ef..eb778728a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java @@ -1,6 +1,12 @@ package com.dfsek.terra.addons.flora.flora.gen; -import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; +import net.jafama.FastMath; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.properties.base.Properties; @@ -13,38 +19,35 @@ import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.Flora; import com.dfsek.terra.api.world.World; -import net.jafama.FastMath; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; -import java.util.Random; public class TerraFlora implements Flora { private final List> layers; private final boolean physics; private final boolean ceiling; - + private final MaterialSet irrigable; - + private final MaterialSet spawnable; private final MaterialSet replaceable; - + private final MaterialSet testRotation; - + private final int maxPlacements; - + private final Search search; - + private final boolean spawnBlacklist; - + private final int irrigableOffset; - + private final TerraPlugin main; - + private final NoiseSampler distribution; - - public TerraFlora(List layers, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main, NoiseSampler distribution) { + + public TerraFlora(List layers, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, + MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, + int irrigableOffset, TerraPlugin main, NoiseSampler distribution) { this.physics = physics; this.testRotation = testRotation; this.spawnBlacklist = spawnBlacklist; @@ -57,7 +60,7 @@ public class TerraFlora implements Flora { this.irrigableOffset = irrigableOffset; this.main = main; this.distribution = distribution; - + this.layers = new ArrayList<>(); layers.forEach(layer -> { for(int i = 0; i < layer.getLayers(); i++) { @@ -65,7 +68,35 @@ public class TerraFlora implements Flora { } }); } - + + @Override + public boolean plant(Vector3 location, World world) { + boolean doRotation = testRotation.size() > 0; + int size = layers.size(); + int c = ceiling ? -1 : 1; + + EnumSet faces = doRotation ? getFaces(location.clone().add(0, c, 0), world) : EnumSet.noneOf(Direction.class); + if(doRotation && faces.size() == 0) return false; // Don't plant if no faces are valid. + + for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor + int lvl = (FastMath.abs(i)); + BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), + location.getZ(), world.getSeed()).clone(); + if(doRotation) { + Direction oneFace = new ArrayList<>(faces).get( + new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face. + + data.setIfPresent(Properties.DIRECTION, oneFace.opposite()) + .setIfPresent(Properties.NORTH, faces.contains(Direction.NORTH)) + .setIfPresent(Properties.SOUTH, faces.contains(Direction.SOUTH)) + .setIfPresent(Properties.EAST, faces.contains(Direction.EAST)) + .setIfPresent(Properties.WEST, faces.contains(Direction.WEST)); + } + world.setBlockData(location.clone().add(0, i + c, 0), data, physics); + } + return true; + } + @Override public List getValidSpawnsAt(Chunk chunk, int x, int z, Range range) { int size = layers.size(); @@ -76,14 +107,17 @@ public class TerraFlora implements Flora { for(int y : range) { if(y > 255 || y < 0) continue; current = current.add(0, search.equals(Search.UP) ? 1 : -1, 0); - if((spawnBlacklist != spawnable.contains(chunk.getBlock(current.getBlockX(), current.getBlockY(), current.getBlockZ()).getBlockType())) && isIrrigated(current.clone().add(cx, irrigableOffset, cz), chunk.getWorld()) && valid(size, current.clone().add(cx, 0, cz), chunk.getWorld())) { + if((spawnBlacklist != spawnable.contains( + chunk.getBlock(current.getBlockX(), current.getBlockY(), current.getBlockZ()).getBlockType())) && isIrrigated( + current.clone().add(cx, irrigableOffset, cz), chunk.getWorld()) && valid(size, current.clone().add(cx, 0, cz), + chunk.getWorld())) { blocks.add(current.clone()); if(maxPlacements > 0 && blocks.size() >= maxPlacements) break; } } return blocks; } - + private boolean valid(int size, Vector3 block, World world) { for(int i = 0; i < size; i++) { // Down if ceiling, up if floor if(block.getY() + 1 > 255 || block.getY() < 0) return false; @@ -92,45 +126,25 @@ public class TerraFlora implements Flora { } return true; } - + + private void test(EnumSet faces, Direction f, Vector3 b, World world) { + if(testRotation.contains( + world.getBlockData(b.getBlockX() + f.getModX(), b.getBlockY() + f.getModY(), b.getBlockZ() + f.getModZ()).getBlockType())) + faces.add(f); + } + private boolean isIrrigated(Vector3 b, World world) { if(irrigable == null) return true; return irrigable.contains(world.getBlockData(b.getBlockX() + 1, b.getBlockY(), b.getBlockZ()).getBlockType()) - || irrigable.contains(world.getBlockData(b.getBlockX() - 1, b.getBlockY(), b.getBlockZ()).getBlockType()) - || irrigable.contains(world.getBlockData(b.getBlockX(), b.getBlockY(), b.getBlockZ() + 1).getBlockType()) - || irrigable.contains(world.getBlockData(b.getBlockX(), b.getBlockY(), b.getBlockZ() - 1).getBlockType()); + || irrigable.contains(world.getBlockData(b.getBlockX() - 1, b.getBlockY(), b.getBlockZ()).getBlockType()) + || irrigable.contains(world.getBlockData(b.getBlockX(), b.getBlockY(), b.getBlockZ() + 1).getBlockType()) + || irrigable.contains(world.getBlockData(b.getBlockX(), b.getBlockY(), b.getBlockZ() - 1).getBlockType()); } - + private ProbabilityCollection getStateCollection(int layer) { - return layers.get(FastMath.max(FastMath.min(layer, layers.size()-1), 0)); + return layers.get(FastMath.max(FastMath.min(layer, layers.size() - 1), 0)); } - - @Override - public boolean plant(Vector3 location, World world) { - boolean doRotation = testRotation.size() > 0; - int size = layers.size(); - int c = ceiling ? -1 : 1; - - EnumSet faces = doRotation ? getFaces(location.clone().add(0, c, 0), world) : EnumSet.noneOf(Direction.class); - if(doRotation && faces.size() == 0) return false; // Don't plant if no faces are valid. - - for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor - int lvl = (FastMath.abs(i)); - BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), location.getZ(), world.getSeed()).clone(); - if(doRotation) { - Direction oneFace = new ArrayList<>(faces).get(new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face. - - data.setIfPresent(Properties.DIRECTION, oneFace.opposite()) - .setIfPresent(Properties.NORTH, faces.contains(Direction.NORTH)) - .setIfPresent(Properties.SOUTH, faces.contains(Direction.SOUTH)) - .setIfPresent(Properties.EAST, faces.contains(Direction.EAST)) - .setIfPresent(Properties.WEST, faces.contains(Direction.WEST)); - } - world.setBlockData(location.clone().add(0, i + c, 0), data, physics); - } - return true; - } - + private EnumSet getFaces(Vector3 b, World world) { EnumSet faces = EnumSet.noneOf(Direction.class); test(faces, Direction.NORTH, b, world); @@ -139,12 +153,7 @@ public class TerraFlora implements Flora { test(faces, Direction.WEST, b, world); return faces; } - - private void test(EnumSet faces, Direction f, Vector3 b, World world) { - if(testRotation.contains(world.getBlockData(b.getBlockX() + f.getModX(), b.getBlockY() + f.getModY(), b.getBlockZ() + f.getModZ()).getBlockType())) - faces.add(f); - } - + public enum Search { UP, DOWN diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java index 46a9f62e4..9e8458c63 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java @@ -1,6 +1,9 @@ package com.dfsek.terra.addons.feature.locator; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + import com.dfsek.terra.addons.feature.locator.config.AndLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.NoiseLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.OrLocatorTemplate; @@ -27,44 +30,45 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.function.Supplier; @Addon("config-locators") @Version("1.0.0") @Author("Terra") public class LocatorAddon extends TerraAddon { - - public static final TypeKey>> LOCATOR_TOKEN = new TypeKey<>() {}; - public static final TypeKey>> PATTERN_TOKEN = new TypeKey<>() {}; + + public static final TypeKey>> LOCATOR_TOKEN = new TypeKey<>() { + }; + public static final TypeKey>> PATTERN_TOKEN = new TypeKey<>() { + }; @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN); - locatorRegistry.register("SURFACE", () -> new SurfaceLocatorTemplate(main)); - locatorRegistry.register("RANDOM", RandomLocatorTemplate::new); - locatorRegistry.register("PATTERN", PatternLocatorTemplate::new); - locatorRegistry.register("NOISE", NoiseLocatorTemplate::new); - - locatorRegistry.register("AND", AndLocatorTemplate::new); - locatorRegistry.register("OR", OrLocatorTemplate::new); - }) - .then(event -> { - CheckedRegistry>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN); - patternRegistry.register("MATCH_AIR", AirMatchPatternTemplate::new); - patternRegistry.register("MATCH_SOLID", SolidMatchPatternTemplate::new); - patternRegistry.register("MATCH", SingleBlockMatchPatternTemplate::new); - patternRegistry.register("MATCH_SET", BlockSetMatchPatternTemplate::new); - - patternRegistry.register("AND", AndPatternTemplate::new); - patternRegistry.register("OR", OrPatternTemplate::new); - patternRegistry.register("NOT", NotPatternTemplate::new); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN); + locatorRegistry.register("SURFACE", () -> new SurfaceLocatorTemplate(main)); + locatorRegistry.register("RANDOM", RandomLocatorTemplate::new); + locatorRegistry.register("PATTERN", PatternLocatorTemplate::new); + locatorRegistry.register("NOISE", NoiseLocatorTemplate::new); + + locatorRegistry.register("AND", AndLocatorTemplate::new); + locatorRegistry.register("OR", OrLocatorTemplate::new); + }) + .then(event -> { + CheckedRegistry>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN); + patternRegistry.register("MATCH_AIR", AirMatchPatternTemplate::new); + patternRegistry.register("MATCH_SOLID", SolidMatchPatternTemplate::new); + patternRegistry.register("MATCH", SingleBlockMatchPatternTemplate::new); + patternRegistry.register("MATCH_SET", BlockSetMatchPatternTemplate::new); + + patternRegistry.register("AND", AndPatternTemplate::new); + patternRegistry.register("OR", OrPatternTemplate::new); + patternRegistry.register("NOT", NotPatternTemplate::new); + }) + .failThrough(); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java index a26486370..404c38a8a 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/AndLocatorTemplate.java @@ -4,16 +4,17 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.feature.locator.patterns.Pattern; + +import java.util.List; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import java.util.List; public class AndLocatorTemplate implements ObjectTemplate, ValidatedConfigTemplate { @Value("locators") private @Meta List<@Meta Locator> locators; - + @Override public Locator get() { Locator current = locators.remove(0); @@ -22,7 +23,7 @@ public class AndLocatorTemplate implements ObjectTemplate, ValidatedCon } return current; } - + @Override public boolean validate() throws ValidationException { if(locators.isEmpty()) throw new ValidationException("AND Pattern must specify at least 1 pattern."); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/NoiseLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/NoiseLocatorTemplate.java index 835dbdd34..ca0f33137 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/NoiseLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/NoiseLocatorTemplate.java @@ -2,17 +2,19 @@ package com.dfsek.terra.addons.feature.locator.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + import com.dfsek.terra.addons.feature.locator.locators.NoiseLocator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.Locator; -import java.util.List; public class NoiseLocatorTemplate implements ObjectTemplate { @Value("samplers") private @Meta List<@Meta NoiseSampler> samplers; - + @Override public Locator get() { return new NoiseLocator(samplers); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java index 2ea4c6641..38e0d660c 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/OrLocatorTemplate.java @@ -4,15 +4,17 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; -import java.util.List; public class OrLocatorTemplate implements ObjectTemplate, ValidatedConfigTemplate { @Value("locators") private @Meta List<@Meta Locator> locators; - + @Override public Locator get() { Locator current = locators.remove(0); @@ -21,7 +23,7 @@ public class OrLocatorTemplate implements ObjectTemplate, ValidatedConf } return current; } - + @Override public boolean validate() throws ValidationException { if(locators.isEmpty()) throw new ValidationException("AND Pattern must specify at least 1 pattern."); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java index cdf926843..c27054675 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/PatternLocatorTemplate.java @@ -2,19 +2,21 @@ package com.dfsek.terra.addons.feature.locator.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.feature.locator.locators.PatternLocator; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; + public class PatternLocatorTemplate implements ObjectTemplate { @Value("range") private @Meta Range range; - + @Value("pattern") private @Meta Pattern pattern; - + @Override public Locator get() { return new PatternLocator(pattern, range); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java index 543ce5ca8..347294d3f 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/RandomLocatorTemplate.java @@ -2,19 +2,20 @@ package com.dfsek.terra.addons.feature.locator.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.feature.locator.locators.RandomLocator; -import com.dfsek.terra.addons.feature.locator.locators.SurfaceLocator; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; + public class RandomLocatorTemplate implements ObjectTemplate { @Value("height") private @Meta Range height; - + @Value("amount") private @Meta Range amount; - + @Override public Locator get() { return new RandomLocator(height, amount); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java index 731cc68a8..2fb6cd3e3 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/SurfaceLocatorTemplate.java @@ -2,22 +2,24 @@ package com.dfsek.terra.addons.feature.locator.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.feature.locator.locators.SurfaceLocator; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; + public class SurfaceLocatorTemplate implements ObjectTemplate { private final TerraPlugin main; - + @Value("range") private @Meta Range range; - + public SurfaceLocatorTemplate(TerraPlugin main) { this.main = main; } - + @Override public Locator get() { return new SurfaceLocator(range, main); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java index d54e4c49c..dfd65ec38 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java @@ -2,17 +2,19 @@ package com.dfsek.terra.addons.feature.locator.config.pattern; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.feature.locator.patterns.Pattern; + import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; +import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.Range; + public class AirMatchPatternTemplate implements ObjectTemplate { @Value("offset") private @Meta Range offset; - - + + @Override public Pattern get() { return new MatchPattern(offset, BlockState::isAir); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java index af3ae0564..78ff11428 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AndPatternTemplate.java @@ -4,15 +4,17 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; -import java.util.List; public class AndPatternTemplate implements ObjectTemplate, ValidatedConfigTemplate { @Value("patterns") private @Meta List<@Meta Pattern> patterns; - + @Override public Pattern get() { Pattern current = patterns.remove(0); @@ -21,7 +23,7 @@ public class AndPatternTemplate implements ObjectTemplate, ValidatedCon } return current; } - + @Override public boolean validate() throws ValidationException { if(patterns.isEmpty()) throw new ValidationException("AND Pattern must specify at least 1 pattern."); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java index 83c9e429d..6f15ac36d 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java @@ -2,19 +2,21 @@ package com.dfsek.terra.addons.feature.locator.config.pattern; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.feature.locator.patterns.Pattern; + import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; +import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; + public class BlockSetMatchPatternTemplate implements ObjectTemplate { @Value("blocks") private @Meta MaterialSet blocks; - + @Value("offset") private @Meta Range offset; - + @Override public Pattern get() { return new MatchPattern(offset, blockState -> blocks.contains(blockState.getBlockType())); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java index 310ccfd02..fcf40e57b 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/NotPatternTemplate.java @@ -2,13 +2,15 @@ package com.dfsek.terra.addons.feature.locator.config.pattern; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; + public class NotPatternTemplate implements ObjectTemplate { @Value("pattern") private @Meta Pattern pattern; - + @Override public Pattern get() { return pattern.not(); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java index 538629e98..5e1369724 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/OrPatternTemplate.java @@ -4,15 +4,17 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; -import java.util.List; public class OrPatternTemplate implements ObjectTemplate, ValidatedConfigTemplate { @Value("patterns") private @Meta List<@Meta Pattern> patterns; - + @Override public Pattern get() { Pattern current = patterns.remove(0); @@ -21,7 +23,7 @@ public class OrPatternTemplate implements ObjectTemplate, ValidatedConf } return current; } - + @Override public boolean validate() throws ValidationException { if(patterns.isEmpty()) throw new ValidationException("AND Pattern must specify at least 1 pattern."); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java index 2a40ce285..782d0ca5d 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SingleBlockMatchPatternTemplate.java @@ -2,20 +2,22 @@ package com.dfsek.terra.addons.feature.locator.config.pattern; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.feature.locator.patterns.Pattern; + import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; +import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.Range; + public class SingleBlockMatchPatternTemplate implements ObjectTemplate { @Value("block") private @Meta BlockState block; - + @Value("offset") private @Meta Range offset; - - + + @Override public Pattern get() { return new MatchPattern(offset, block::matches); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java index 800def8ef..eebb03197 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java @@ -2,14 +2,16 @@ package com.dfsek.terra.addons.feature.locator.config.pattern; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.addons.feature.locator.patterns.Pattern; + import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; +import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.util.Range; + public class SolidMatchPatternTemplate implements ObjectTemplate { @Value("offset") private Range offset; - + @Override public Pattern get() { return new MatchPattern(offset, blockState -> blockState.getBlockType().isSolid()); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/NoiseLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/NoiseLocator.java index addeaa10b..b88ad0295 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/NoiseLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/NoiseLocator.java @@ -1,31 +1,33 @@ package com.dfsek.terra.addons.feature.locator.locators; +import net.jafama.FastMath; + +import java.util.List; + import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.world.Column; -import net.jafama.FastMath; -import java.util.List; public class NoiseLocator implements Locator { private final List samplers; - + public NoiseLocator(List samplers) { this.samplers = samplers; } - + @Override public BinaryColumn getSuitableCoordinates(Column column) { BinaryColumn results = new BinaryColumn(column.getMinY(), column.getMaxY()); - + long seed = column.getWorld().getSeed(); samplers.forEach(sampler -> { int y = FastMath.floorToInt(sampler.getNoiseSeeded(seed, column.getX(), column.getX())); if(y >= column.getMaxY() || y < column.getMinY()) return; results.set(y); }); - + return results; } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java index 64dcc7bbb..a5faddf4c 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java @@ -6,26 +6,24 @@ import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.Column; -import java.util.ArrayList; -import java.util.List; public class PatternLocator implements Locator { private final Pattern pattern; private final Range search; - + public PatternLocator(Pattern pattern, Range search) { this.pattern = pattern; this.search = search; } - + @Override public BinaryColumn getSuitableCoordinates(Column column) { BinaryColumn locations = new BinaryColumn(column.getMinY(), column.getMaxY()); - + for(int y : search) { if(pattern.matches(y, column)) locations.set(y); } - + return locations; } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java index 7dd0672b2..78df7b875 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java @@ -1,39 +1,38 @@ package com.dfsek.terra.addons.feature.locator.locators; +import java.util.Random; + import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.Column; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; public class RandomLocator implements Locator { private final Range height; - + private final Range points; - + public RandomLocator(Range height, Range points) { this.height = height; this.points = points; } - + @Override public BinaryColumn getSuitableCoordinates(Column column) { long seed = column.getWorld().getSeed(); seed = 31 * seed + column.getX(); seed = 31 * seed + column.getZ(); - + Random r = new Random(seed); - + int size = points.get(r); - + BinaryColumn results = new BinaryColumn(column.getMinY(), column.getMaxY()); for(int i = 0; i < size; i++) { results.set(height.get(r)); } - + return results; } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java index 85da18385..79810c8a3 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java @@ -7,23 +7,22 @@ import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.Column; -import java.util.Collections; public class SurfaceLocator implements Locator { private final Range search; - + private final BlockState air; - + public SurfaceLocator(Range search, TerraPlugin main) { this.search = search; this.air = main.getWorldHandle().air(); } - + @Override public BinaryColumn getSuitableCoordinates(Column column) { BinaryColumn location = new BinaryColumn(column.getMinY(), column.getMaxY()); for(int y : search) { - if(column.getBlock(y).matches(air) && !column.getBlock(y-1).matches(air)) { + if(column.getBlock(y).matches(air) && !column.getBlock(y - 1).matches(air)) { location.set(y); return location; } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java index da85e8605..d305d64d8 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java @@ -1,21 +1,21 @@ package com.dfsek.terra.addons.feature.locator.patterns; -import com.dfsek.terra.addons.feature.locator.patterns.Pattern; +import java.util.function.Predicate; + import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.Column; -import java.util.function.Predicate; public class MatchPattern implements Pattern { private final Range range; private final Predicate matches; - + public MatchPattern(Range range, Predicate matches) { this.range = range; this.matches = matches; } - + @Override public boolean matches(int y, Column column) { for(int i : range) { diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java index a5937b770..2aae3af0d 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java @@ -2,17 +2,18 @@ package com.dfsek.terra.addons.feature.locator.patterns; import com.dfsek.terra.api.world.Column; + public interface Pattern { boolean matches(int y, Column column); - + default Pattern and(Pattern that) { return (y, column) -> this.matches(y, column) && that.matches(y, column); } - + default Pattern or(Pattern that) { return (y, column) -> this.matches(y, column) || that.matches(y, column); } - + default Pattern not() { return (y, column) -> !this.matches(y, column); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java index ae0656575..0b39cc1dd 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -1,6 +1,11 @@ package com.dfsek.terra.addons.noise; import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; @@ -37,70 +42,69 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; @Addon("config-noise-function") @Author("Terra") @Version("1.0.0") public class NoiseAddon extends TerraAddon { + public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { + }; @Inject private TerraPlugin plugin; - - public static final TypeKey>> NOISE_SAMPLER_TOKEN = new TypeKey<>() {}; - + @Override public void initialize() { plugin.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry(NOISE_SAMPLER_TOKEN); - event.getPack() - .applyLoader(CellularSampler.DistanceFunction.class, (t, o, l) -> CellularSampler.DistanceFunction.valueOf((String) o)) - .applyLoader(CellularSampler.ReturnType.class, (t, o, l) -> CellularSampler.ReturnType.valueOf((String) o)) - .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new); - - noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new); - noiseRegistry.register("NORMAL", NormalNormalizerTemplate::new); - noiseRegistry.register("CLAMP", ClampNormalizerTemplate::new); - - noiseRegistry.register("IMAGE", ImageSamplerTemplate::new); - - noiseRegistry.register("DOMAIN_WARP", DomainWarpTemplate::new); - - noiseRegistry.register("FBM", BrownianMotionTemplate::new); - noiseRegistry.register("PING_PONG", PingPongTemplate::new); - noiseRegistry.register("RIDGED", RidgedFractalTemplate::new); - - noiseRegistry.register("OPEN_SIMPLEX_2", () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new)); - noiseRegistry.register("OPEN_SIMPLEX_2S", () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new)); - noiseRegistry.register("PERLIN", () -> new SimpleNoiseTemplate(PerlinSampler::new)); - noiseRegistry.register("SIMPLEX", () -> new SimpleNoiseTemplate(SimplexSampler::new)); - noiseRegistry.register("GABOR", GaborNoiseTemplate::new); - - - noiseRegistry.register("VALUE", () -> new SimpleNoiseTemplate(ValueSampler::new)); - noiseRegistry.register("VALUE_CUBIC", () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); - - noiseRegistry.register("CELLULAR", CellularNoiseTemplate::new); - - noiseRegistry.register("WHITE_NOISE", () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); - noiseRegistry.register("GAUSSIAN", () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); - - noiseRegistry.register("CONSTANT", ConstantNoiseTemplate::new); - - noiseRegistry.register("KERNEL", KernelTemplate::new); - - Map packFunctions = new HashMap<>(); - noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packFunctions)); - - - NoiseConfigPackTemplate template = new NoiseConfigPackTemplate(); - event.loadTemplate(template); - packFunctions.putAll(template.getNoiseBuilderMap()); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + NOISE_SAMPLER_TOKEN); + event.getPack() + .applyLoader(CellularSampler.DistanceFunction.class, + (t, o, l) -> CellularSampler.DistanceFunction.valueOf((String) o)) + .applyLoader(CellularSampler.ReturnType.class, (t, o, l) -> CellularSampler.ReturnType.valueOf((String) o)) + .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new); + + noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new); + noiseRegistry.register("NORMAL", NormalNormalizerTemplate::new); + noiseRegistry.register("CLAMP", ClampNormalizerTemplate::new); + + noiseRegistry.register("IMAGE", ImageSamplerTemplate::new); + + noiseRegistry.register("DOMAIN_WARP", DomainWarpTemplate::new); + + noiseRegistry.register("FBM", BrownianMotionTemplate::new); + noiseRegistry.register("PING_PONG", PingPongTemplate::new); + noiseRegistry.register("RIDGED", RidgedFractalTemplate::new); + + noiseRegistry.register("OPEN_SIMPLEX_2", () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new)); + noiseRegistry.register("OPEN_SIMPLEX_2S", () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new)); + noiseRegistry.register("PERLIN", () -> new SimpleNoiseTemplate(PerlinSampler::new)); + noiseRegistry.register("SIMPLEX", () -> new SimpleNoiseTemplate(SimplexSampler::new)); + noiseRegistry.register("GABOR", GaborNoiseTemplate::new); + + + noiseRegistry.register("VALUE", () -> new SimpleNoiseTemplate(ValueSampler::new)); + noiseRegistry.register("VALUE_CUBIC", () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); + + noiseRegistry.register("CELLULAR", CellularNoiseTemplate::new); + + noiseRegistry.register("WHITE_NOISE", () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); + noiseRegistry.register("GAUSSIAN", () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); + + noiseRegistry.register("CONSTANT", ConstantNoiseTemplate::new); + + noiseRegistry.register("KERNEL", KernelTemplate::new); + + Map packFunctions = new HashMap<>(); + noiseRegistry.register("EXPRESSION", () -> new ExpressionFunctionTemplate(packFunctions)); + + + NoiseConfigPackTemplate template = new NoiseConfigPackTemplate(); + event.loadTemplate(template); + packFunctions.putAll(template.getNoiseBuilderMap()); + }) + .failThrough(); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java index 9bff92dbd..e8e733d25 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseConfigPackTemplate.java @@ -2,15 +2,17 @@ package com.dfsek.terra.addons.noise; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; + +import java.util.Map; + import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.api.config.meta.Meta; -import java.util.Map; public class NoiseConfigPackTemplate implements ConfigTemplate { @Value("noise") private @Meta Map noiseBuilderMap; - + public Map getNoiseBuilderMap() { return noiseBuilderMap; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java index 7fdc5d393..20e922fed 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/DimensionApplicableNoiseSampler.java @@ -2,26 +2,28 @@ package com.dfsek.terra.addons.noise.config; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + public class DimensionApplicableNoiseSampler implements ObjectTemplate { @Value("dimensions") private @Meta int dimensions; - + @Value(".") private @Meta NoiseSampler sampler; - - public int getDimensions() { - return dimensions; - } - - public NoiseSampler getSampler() { - return sampler; - } - + @Override public DimensionApplicableNoiseSampler get() { return this; } + + public int getDimensions() { + return dimensions; + } + + public NoiseSampler getSampler() { + return sampler; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java index 0305197a0..9fe96b1ed 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java @@ -2,22 +2,24 @@ package com.dfsek.terra.addons.noise.config.templates; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.samplers.DomainWarpedSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class DomainWarpTemplate extends SamplerTemplate { @Value("warp") private @Meta NoiseSampler warp; - + @Value("function") private @Meta NoiseSampler function; - + @Value("amplitude") @Default private @Meta double amplitude = 1; - + @Override public NoiseSampler get() { return new DomainWarpedSampler(function, warp, amplitude); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java index 54f88a18d..79cbc0078 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/FunctionTemplate.java @@ -2,28 +2,30 @@ package com.dfsek.terra.addons.noise.config.templates; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.config.meta.Meta; import java.util.List; +import com.dfsek.terra.api.config.meta.Meta; + + @SuppressWarnings("unused") public class FunctionTemplate implements ObjectTemplate { @Value("arguments") private List args; - + @Value("function") private @Meta String function; - - public List getArgs() { - return args; - } - - public String getFunction() { - return function; - } - + @Override public FunctionTemplate get() { return this; } + + public List getArgs() { + return args; + } + + public String getFunction() { + return function; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java index dd541873f..f0e37eb69 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java @@ -1,24 +1,26 @@ package com.dfsek.terra.addons.noise.config.templates; import com.dfsek.tectonic.annotations.Value; + +import java.awt.image.BufferedImage; + import com.dfsek.terra.addons.noise.samplers.ImageSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -import java.awt.image.BufferedImage; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class ImageSamplerTemplate extends SamplerTemplate { - + @Value("image") private @Meta BufferedImage image; - + @Value("frequency") private @Meta double frequency; - + @Value("channel") private ImageSampler.@Meta Channel channel; - + @Override public NoiseSampler get() { return new ImageSampler(image, channel, frequency); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java index 173ce0f1c..0bb4e3544 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/KernelTemplate.java @@ -2,60 +2,61 @@ package com.dfsek.terra.addons.noise.config.templates; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; + +import java.util.List; + import com.dfsek.terra.addons.noise.samplers.KernelSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -import java.util.List; - -@SuppressWarnings({"unused", "FieldMayBeFinal"}) -public class KernelTemplate extends SamplerTemplate implements ValidatedConfigTemplate { +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) +public class KernelTemplate extends SamplerTemplate { + @Value("kernel") private @Meta List<@Meta List<@Meta Double>> kernel; - + @Value("factor") @Default private @Meta double factor = 1; - + @Value("function") private @Meta NoiseSampler function; - + @Value("frequency") @Default private @Meta double frequency = 1; - + @Override public NoiseSampler get() { double[][] k = new double[kernel.size()][kernel.get(0).size()]; - + for(int x = 0; x < kernel.size(); x++) { for(int y = 0; y < kernel.get(x).size(); y++) { k[x][y] = kernel.get(x).get(y) * factor; } } - + KernelSampler sampler = new KernelSampler(k, function); sampler.setFrequency(frequency); return sampler; } - + @Override public boolean validate() throws ValidationException { - + if(kernel.isEmpty()) throw new ValidationException("Kernel must not be empty."); - + int len = kernel.get(0).size(); - + if(len == 0) throw new ValidationException("Kernel row must contain data."); - + for(int i = 0; i < kernel.size(); i++) { if(kernel.get(i).size() != len) throw new ValidationException("Kernel row " + i + " size mismatch. Expected " + len + ", found " + kernel.get(i).size()); } - + return super.validate(); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java index 319d85ed1..b281f1d77 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/SamplerTemplate.java @@ -5,22 +5,24 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + @SuppressWarnings("FieldMayBeFinal") public abstract class SamplerTemplate implements ValidatedConfigTemplate, ObjectTemplate { @Value("dimensions") @Default private @Meta int dimensions = 2; - - public int getDimensions() { - return dimensions; - } - + @Override public boolean validate() throws ValidationException { if(dimensions != 2 && dimensions != 3) throw new ValidationException("Illegal amount of dimensions: " + dimensions); return true; } + + public int getDimensions() { + return dimensions; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java index 728ee7254..1162be34b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java @@ -2,30 +2,32 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler; import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + @SuppressWarnings("FieldMayBeFinal") public class CellularNoiseTemplate extends NoiseTemplate { @Value("distance") @Default private CellularSampler.@Meta DistanceFunction cellularDistanceFunction = CellularSampler.DistanceFunction.EuclideanSq; - + @Value("return") @Default private CellularSampler.@Meta ReturnType cellularReturnType = CellularSampler.ReturnType.Distance; - + @Value("jitter") @Default private @Meta double cellularJitter = 1.0D; - - + + @Value("lookup") @Default private @Meta NoiseSampler lookup = new OpenSimplex2Sampler(); - + @Override public NoiseSampler get() { CellularSampler sampler = new CellularSampler(); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java index dd3311737..87eb684db 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ConstantNoiseTemplate.java @@ -2,17 +2,19 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + @SuppressWarnings("FieldMayBeFinal") public class ConstantNoiseTemplate extends SamplerTemplate { @Value("value") @Default private @Meta double value = 0d; - + @Override public NoiseSampler get() { return new ConstantSampler(value); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java index 2db025d2f..58ad1ab07 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java @@ -6,8 +6,12 @@ import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; @@ -18,33 +22,29 @@ import com.dfsek.terra.addons.noise.samplers.noise.ExpressionFunction; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -@SuppressWarnings({"FieldMayBeFinal", "unused"}) -public class ExpressionFunctionTemplate extends SamplerTemplate implements ValidatedConfigTemplate { +@SuppressWarnings({ "FieldMayBeFinal", "unused" }) +public class ExpressionFunctionTemplate extends SamplerTemplate { private final Map otherFunctions; @Value("variables") @Default private @Meta Map vars = new HashMap<>(); - + @Value("expression") private @Meta String equation; - + @Value("functions") @Default private @Meta LinkedHashMap functions = new LinkedHashMap<>(); - + @Value("functions") @Default private @Meta LinkedHashMap expressions = new LinkedHashMap<>(); - + public ExpressionFunctionTemplate(Map otherFunctions) { this.otherFunctions = otherFunctions; } - + @Override public NoiseSampler get() { try { @@ -54,7 +54,7 @@ public class ExpressionFunctionTemplate extends SamplerTemplate generateFunctions() throws ParseException { Map noiseFunctionMap = new HashMap<>(); - + for(Map.Entry entry : expressions.entrySet()) { noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope())); } - + otherFunctions.forEach((id, function) -> { if(function.getDimensions() == 2) { noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); }); - + functions.forEach((id, function) -> { if(function.getDimensions() == 2) { noiseFunctionMap.put(id, new NoiseFunction2(function.getSampler())); } else noiseFunctionMap.put(id, new NoiseFunction3(function.getSampler())); }); - + return noiseFunctionMap; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java index c9bc2e52f..0fa207a0d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java @@ -2,31 +2,33 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.samplers.noise.GaborNoiseSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + public class GaborNoiseTemplate extends NoiseTemplate { @Value("rotation") @Default - private @Meta double rotation = 0.25; - + private final @Meta double rotation = 0.25; + @Value("isotropic") @Default - private @Meta boolean isotropic = true; - + private final @Meta boolean isotropic = true; + @Value("deviation") @Default - private @Meta double deviation = 1.0; - + private final @Meta double deviation = 1.0; + @Value("impulses") @Default - private @Meta double impulses = 64d; - + private final @Meta double impulses = 64d; + @Value("frequency_0") @Default - private @Meta double f0 = 0.625; - + private final @Meta double f0 = 0.625; + @Override public NoiseSampler get() { GaborNoiseSampler gaborNoiseSampler = new GaborNoiseSampler(); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java index d5807cd8a..4ce1a07dc 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java @@ -2,17 +2,18 @@ package com.dfsek.terra.addons.noise.config.templates.noise; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public abstract class NoiseTemplate extends SamplerTemplate { @Value("frequency") @Default protected @Meta double frequency = 0.02d; - + @Value("salt") @Default protected @Meta long salt = 0; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java index 915b06dcc..455f8642a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java @@ -1,18 +1,18 @@ package com.dfsek.terra.addons.noise.config.templates.noise; +import java.util.function.Supplier; + import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.noise.NoiseSampler; -import java.util.function.Function; -import java.util.function.Supplier; public class SimpleNoiseTemplate extends NoiseTemplate { private final Supplier samplerSupplier; - + public SimpleNoiseTemplate(Supplier samplerSupplier) { this.samplerSupplier = samplerSupplier; } - + @Override public NoiseSampler get() { NoiseFunction sampler = samplerSupplier.get(); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java index 3a3ce6c9d..801aed0a5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/BrownianMotionTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; import com.dfsek.terra.addons.noise.samplers.noise.fractal.BrownianMotionSampler; import com.dfsek.terra.api.noise.NoiseSampler; + public class BrownianMotionTemplate extends FractalTemplate { @Override public NoiseSampler get() { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java index 521fe9ac9..e92228663 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/FractalTemplate.java @@ -2,28 +2,30 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.samplers.noise.fractal.FractalNoiseFunction; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + public abstract class FractalTemplate extends SamplerTemplate { @Value("octaves") @Default protected @Meta int octaves = 3; - + @Value("gain") @Default protected @Meta double fractalGain = 0.5D; - + @Value("lacunarity") @Default protected @Meta double fractalLacunarity = 2.0D; - + @Value("weighted-strength") @Default protected @Meta double weightedStrength = 0.0D; - + @Value("function") protected @Meta NoiseSampler function; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java index 618fc19c9..145aeea32 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/PingPongTemplate.java @@ -2,16 +2,18 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.samplers.noise.fractal.PingPongSampler; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class PingPongTemplate extends FractalTemplate { @Value("ping-pong") @Default private @Meta double pingPong = 2.0D; - + @Override public NoiseSampler get() { PingPongSampler sampler = new PingPongSampler(function); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java index 85c69a4b1..70d606ed0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/fractal/RidgedFractalTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.addons.noise.config.templates.noise.fractal; import com.dfsek.terra.addons.noise.samplers.noise.fractal.RidgedFractalSampler; import com.dfsek.terra.api.noise.NoiseSampler; + public class RidgedFractalTemplate extends FractalTemplate { @Override public NoiseSampler get() { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java index 030550888..4e8287a0f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/ClampNormalizerTemplate.java @@ -1,18 +1,20 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.normalizer.ClampNormalizer; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class ClampNormalizerTemplate extends NormalizerTemplate { @Value("max") private @Meta double max; - + @Value("min") private @Meta double min; - + @Override public NoiseSampler get() { return new ClampNormalizer(function, min, max); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java index 99d316813..171123493 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/LinearNormalizerTemplate.java @@ -1,18 +1,20 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.normalizer.LinearNormalizer; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class LinearNormalizerTemplate extends NormalizerTemplate { @Value("max") private @Meta double max; - + @Value("min") private @Meta double min; - + @Override public NoiseSampler get() { return new LinearNormalizer(function, min, max); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalNormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalNormalizerTemplate.java index 16d3c8194..c55647f90 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalNormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalNormalizerTemplate.java @@ -2,22 +2,24 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.normalizer.NormalNormalizer; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class NormalNormalizerTemplate extends NormalizerTemplate { @Value("mean") private @Meta double mean; - + @Value("standard-deviation") private @Meta double stdDev; - + @Value("groups") @Default private @Meta int groups = 16384; - + @Override public NoiseSampler get() { return new NormalNormalizer(function, groups, mean, stdDev); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalizerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalizerTemplate.java index 3ddbf9829..1d435acd6 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalizerTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/normalizer/NormalizerTemplate.java @@ -1,11 +1,13 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer; import com.dfsek.tectonic.annotations.Value; + import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.normalizer.Normalizer; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; + public abstract class NormalizerTemplate extends SamplerTemplate { @Value("function") protected @Meta NoiseSampler function; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java index 3bce239c1..b8c093585 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/ClampNormalizer.java @@ -1,18 +1,20 @@ package com.dfsek.terra.addons.noise.normalizer; -import com.dfsek.terra.api.noise.NoiseSampler; import net.jafama.FastMath; +import com.dfsek.terra.api.noise.NoiseSampler; + + public class ClampNormalizer extends Normalizer { private final double min; private final double max; - + public ClampNormalizer(NoiseSampler sampler, double min, double max) { super(sampler); this.min = min; this.max = max; } - + @Override public double normalize(double in) { return FastMath.max(FastMath.min(in, max), min); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java index faaa5c587..3d355045a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/LinearNormalizer.java @@ -2,19 +2,20 @@ package com.dfsek.terra.addons.noise.normalizer; import com.dfsek.terra.api.noise.NoiseSampler; + /** * Normalizer to linearly scale data's range. */ public class LinearNormalizer extends Normalizer { private final double min; private final double max; - + public LinearNormalizer(NoiseSampler sampler, double min, double max) { super(sampler); this.min = min; this.max = max; } - + @Override public double normalize(double in) { return (in - min) * (2 / (max - min)) - 1; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java index d56ac8a82..16dda5430 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/NormalNormalizer.java @@ -1,25 +1,27 @@ package com.dfsek.terra.addons.noise.normalizer; +import net.jafama.FastMath; + import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; -import net.jafama.FastMath; + /** * Normalizer to redistribute normally distributed data to a continuous distribution via an automatically generated lookup table. */ public class NormalNormalizer extends Normalizer { - + private final double[] lookup; - + public NormalNormalizer(NoiseSampler sampler, int buckets, double mean, double standardDeviation) { super(sampler); this.lookup = new double[buckets]; - + for(int i = 0; i < buckets; i++) { lookup[i] = MathUtil.normalInverse((double) i / buckets, mean, standardDeviation); } } - + @Override public double normalize(double in) { int start = 0; @@ -34,12 +36,12 @@ public class NormalNormalizer extends Normalizer { } double left = FastMath.abs(lookup[start] - in); double right = FastMath.abs(lookup[end] - in); - + double fin; if(left <= right) { fin = (double) start / (lookup.length); } else fin = (double) end / (lookup.length); - + return (fin - 0.5) * 2; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java index 08cc87eda..c99a54a83 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java @@ -2,20 +2,21 @@ package com.dfsek.terra.addons.noise.normalizer; import com.dfsek.terra.api.noise.NoiseSampler; + public abstract class Normalizer implements NoiseSampler { private final NoiseSampler sampler; - + public Normalizer(NoiseSampler sampler) { this.sampler = sampler; } - + public abstract double normalize(double in); - + @Override public double getNoiseSeeded(long seed, double x, double y) { return normalize(sampler.getNoiseSeeded(seed, x, y)); } - + @Override public double getNoiseSeeded(long seed, double x, double y, double z) { return normalize(sampler.getNoiseSeeded(seed, x, y, z)); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java index d7d99aeb5..aa60d1f0f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java @@ -6,44 +6,45 @@ import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; + import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; public class UserDefinedFunction implements DynamicFunction { private final Expression expression; private final int args; - + protected UserDefinedFunction(Expression expression, int args) { this.expression = expression; this.args = args; } - + public static UserDefinedFunction newInstance(FunctionTemplate template, Parser parser, Scope parent) throws ParseException { - + Scope functionScope = new Scope().withParent(parent); - + template.getArgs().forEach(functionScope::addInvocationVariable); - + return new UserDefinedFunction(parser.parse(template.getFunction(), functionScope), template.getArgs().size()); } - + @Override public double eval(double... args) { return expression.evaluate(args); } - + @Override public double eval(Context context, double... args) { return expression.evaluate(context, args); } - - @Override - public boolean isStateless() { - return true; - } - + @Override public int getArgNumber() { return args; } + + @Override + public boolean isStateless() { + return true; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java index f12c1576e..63460be9f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java @@ -2,32 +2,32 @@ package com.dfsek.terra.addons.noise.paralithic.noise; import com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; -import com.dfsek.terra.addons.noise.util.HashMapDoubleDouble; + import com.dfsek.terra.api.noise.NoiseSampler; public class NoiseFunction2 implements DynamicFunction { private final NoiseSampler gen; - + public NoiseFunction2(NoiseSampler gen) { this.gen = gen; } - - @Override - public int getArgNumber() { - return 2; - } - + @Override public double eval(double... args) { throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); } - + @Override public double eval(Context context, double... args) { return gen.getNoiseSeeded(((SeedContext) context).getSeed(), args[0], args[1]); } - + + @Override + public int getArgNumber() { + return 2; + } + @Override public boolean isStateless() { return false; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java index 827eb6596..62d7c5b08 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java @@ -2,30 +2,32 @@ package com.dfsek.terra.addons.noise.paralithic.noise; import com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; + import com.dfsek.terra.api.noise.NoiseSampler; + public class NoiseFunction3 implements DynamicFunction { private final NoiseSampler gen; - + public NoiseFunction3(NoiseSampler gen) { this.gen = gen; } - - @Override - public int getArgNumber() { - return 3; - } - + @Override public double eval(double... args) { throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); } - + @Override public double eval(Context context, double... args) { return gen.getNoiseSeeded(((SeedContext) context).getSeed(), args[0], args[1], args[2]); } - + + @Override + public int getArgNumber() { + return 3; + } + @Override public boolean isStateless() { return false; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java index bc490d1c4..8f4bb2bf1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java @@ -2,13 +2,14 @@ package com.dfsek.terra.addons.noise.paralithic.noise; import com.dfsek.paralithic.functions.dynamic.Context; + public class SeedContext implements Context { private final long seed; - + public SeedContext(long seed) { this.seed = seed; } - + public long getSeed() { return seed; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java index eca97002c..7574f8938 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java @@ -2,31 +2,32 @@ package com.dfsek.terra.addons.noise.samplers; import com.dfsek.terra.api.noise.NoiseSampler; + public class DomainWarpedSampler implements NoiseSampler { private final NoiseSampler function; private final NoiseSampler warp; private final double amplitude; - + public DomainWarpedSampler(NoiseSampler function, NoiseSampler warp, double amplitude) { this.function = function; this.warp = warp; this.amplitude = amplitude; } - + @Override public double getNoiseSeeded(long seed, double x, double y) { return function.getNoiseSeeded(seed++, - x + warp.getNoiseSeeded(seed++, x, y) * amplitude, - y + warp.getNoiseSeeded(seed, x, y) * amplitude - ); + x + warp.getNoiseSeeded(seed++, x, y) * amplitude, + y + warp.getNoiseSeeded(seed, x, y) * amplitude + ); } - + @Override public double getNoiseSeeded(long seed, double x, double y, double z) { return function.getNoiseSeeded(seed++, - x + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, - y + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, - z + warp.getNoiseSeeded(seed, x, y, z) * amplitude - ); + x + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, + y + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, + z + warp.getNoiseSeeded(seed, x, y, z) * amplitude + ); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java index d48dc2c26..2c64a954d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java @@ -1,60 +1,68 @@ package com.dfsek.terra.addons.noise.samplers; -import com.dfsek.terra.api.noise.NoiseSampler; import net.jafama.FastMath; import java.awt.image.BufferedImage; +import com.dfsek.terra.api.noise.NoiseSampler; + + public class ImageSampler implements NoiseSampler { private final BufferedImage image; private final Channel channel; - + private final double frequency; - + public ImageSampler(BufferedImage image, Channel channel, double frequency) { this.image = image; this.channel = channel; this.frequency = frequency; } - + @Override public double getNoiseSeeded(long seed, double x, double y) { - return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) * 2; + return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), + FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) * + 2; } - + @Override public double getNoiseSeeded(long seed, double x, double y, double z) { return getNoiseSeeded(seed, x, y); } - + public enum Channel { RED { @Override public int getChannel(int mashed) { return (mashed >> 16) & 0xff; } - }, GREEN { + }, + GREEN { @Override public int getChannel(int mashed) { return (mashed >> 8) & 0xff; } - }, BLUE { + }, + BLUE { @Override public int getChannel(int mashed) { return mashed & 0xff; } - }, GRAYSCALE { + }, + GRAYSCALE { @Override public int getChannel(int mashed) { return (RED.getChannel(mashed) + GREEN.getChannel(mashed) + BLUE.getChannel(mashed)) / 3; } - }, ALPHA { + }, + ALPHA { @Override public int getChannel(int mashed) { return (mashed >> 24) & 0xff; } }; - + public abstract int getChannel(int mashed); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java index b30e16510..23266b3dc 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java @@ -2,48 +2,49 @@ package com.dfsek.terra.addons.noise.samplers; import com.dfsek.terra.api.noise.NoiseSampler; + public class KernelSampler implements NoiseSampler { private final double[][] kernel; private final NoiseSampler in; private double frequency = 1; - + public KernelSampler(double[][] kernel, NoiseSampler in) { this.kernel = kernel; this.in = in; } - + + public void setFrequency(double frequency) { + this.frequency = frequency; + } + @Override public double getNoiseSeeded(long seed, double x, double y) { x *= frequency; y *= frequency; double accumulator = 0; - + for(int kx = 0; kx < kernel.length; kx++) { for(int ky = 0; ky < kernel[kx].length; ky++) { accumulator += in.getNoiseSeeded(seed, x + kx, y + ky) * kernel[kx][ky]; } } - + return accumulator; } - + @Override public double getNoiseSeeded(long seed, double x, double y, double z) { x *= frequency; y *= frequency; z *= frequency; double accumulator = 0; - + for(int kx = 0; kx < kernel.length; kx++) { for(int ky = 0; ky < kernel[kx].length; ky++) { accumulator += in.getNoiseSeeded(seed, x + kx, y, z + ky) * kernel[kx][ky]; } } - + return accumulator; } - - public void setFrequency(double frequency) { - this.frequency = frequency; - } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java index 83f972d7b..5f8de8bde 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; + /** * NoiseSampler implementation for Cellular (Voronoi/Worley) Noise. */ @@ -117,7 +118,7 @@ public class CellularSampler extends NoiseFunction { -0.1842489331d, -0.9777375055d, -0.1004076743d, 0, 0.0775473789d, -0.9111505856d, 0.4047110257d, 0, 0.1399838409d, 0.7601631212d, -0.6344734459d, 0, 0.4484419361d, -0.845289248d, 0.2904925424d, 0 }; - + private static final double[] RAND_VECS_2D = { -0.2700222198d, -0.9628540911d, 0.3863092627d, -0.9223693152d, 0.04444859006d, -0.999011673d, -0.5992523158d, -0.8005602176d, -0.7819280288d, 0.6233687174d, 0.9464672271d, 0.3227999196d, -0.6514146797d, -0.7587218957d, 0.9378472289d, 0.347048376d, @@ -183,70 +184,70 @@ public class CellularSampler extends NoiseFunction { -0.6995302564d, 0.7146029809d, 0.5263414922d, -0.85027327d, -0.5395221479d, 0.841971408d, 0.6579370318d, 0.7530729462d, 0.01426758847d, -0.9998982128d, -0.6734383991d, 0.7392433447d, 0.639412098d, -0.7688642071d, 0.9211571421d, 0.3891908523d, -0.146637214d, -0.9891903394d, -0.782318098d, 0.6228791163d, -0.5039610839d, -0.8637263605d, -0.7743120191d, -0.6328039957d, - }; - - + }; + + private DistanceFunction distanceFunction = DistanceFunction.EuclideanSq; private ReturnType returnType = ReturnType.Distance; private double jitterModifier = 1.0; - + private NoiseSampler noiseLookup; - + public CellularSampler() { noiseLookup = new OpenSimplex2Sampler(); } - + public void setDistanceFunction(DistanceFunction distanceFunction) { this.distanceFunction = distanceFunction; } - + public void setJitterModifier(double jitterModifier) { this.jitterModifier = jitterModifier; } - + public void setNoiseLookup(NoiseSampler noiseLookup) { this.noiseLookup = noiseLookup; } - + public void setReturnType(ReturnType returnType) { this.returnType = returnType; } - + @Override public double getNoiseRaw(long sl, double x, double y) { int seed = (int) sl; int xr = fastRound(x); int yr = fastRound(y); - + double distance0 = Double.MAX_VALUE; double distance1 = Double.MAX_VALUE; double distance2 = Double.MAX_VALUE; - + int closestHash = 0; - + double cellularJitter = 0.43701595 * jitterModifier; - + int xPrimed = (xr - 1) * PRIME_X; int yPrimedBase = (yr - 1) * PRIME_Y; - + Vector2 center = new Vector2(x, y); - + switch(distanceFunction) { default: case Euclidean: case EuclideanSq: for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - + for(int yi = yr - 1; yi <= yr + 1; yi++) { int hash = hash(seed, xPrimed, yPrimed); int idx = hash & (255 << 1); - + double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - + double newDistance = vecX * vecX + vecY * vecY; - + distance1 = fastMax(fastMin(distance1, newDistance), distance0); if(newDistance < distance0) { distance0 = newDistance; @@ -267,16 +268,16 @@ public class CellularSampler extends NoiseFunction { case Manhattan: for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - + for(int yi = yr - 1; yi <= yr + 1; yi++) { int hash = hash(seed, xPrimed, yPrimed); int idx = hash & (255 << 1); - + double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - + double newDistance = fastAbs(vecX) + fastAbs(vecY); - + distance1 = fastMax(fastMin(distance1, newDistance), distance0); if(newDistance < distance0) { distance0 = newDistance; @@ -297,16 +298,16 @@ public class CellularSampler extends NoiseFunction { case Hybrid: for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - + for(int yi = yr - 1; yi <= yr + 1; yi++) { int hash = hash(seed, xPrimed, yPrimed); int idx = hash & (255 << 1); - + double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - + double newDistance = (fastAbs(vecX) + fastAbs(vecY)) + (vecX * vecX + vecY * vecY); - + distance1 = fastMax(fastMin(distance1, newDistance), distance0); if(newDistance < distance0) { distance0 = newDistance; @@ -325,14 +326,14 @@ public class CellularSampler extends NoiseFunction { } break; } - + if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) { distance0 = fastSqrt(distance0); if(returnType != ReturnType.CellValue) { distance1 = fastSqrt(distance1); } } - + switch(returnType) { case CellValue: return closestHash * (1 / 2147483648.0); @@ -364,46 +365,46 @@ public class CellularSampler extends NoiseFunction { return 0; } } - + @Override public double getNoiseRaw(long sl, double x, double y, double z) { int seed = (int) sl; int xr = fastRound(x); int yr = fastRound(y); int zr = fastRound(z); - + double distance0 = Double.MAX_VALUE; double distance1 = Double.MAX_VALUE; double distance2 = Double.MAX_VALUE; int closestHash = 0; - + double cellularJitter = 0.39614353 * jitterModifier; - + int xPrimed = (xr - 1) * PRIME_X; int yPrimedBase = (yr - 1) * PRIME_Y; int zPrimedBase = (zr - 1) * PRIME_Z; - + Vector3 center = new Vector3(x, y, z); - + switch(distanceFunction) { case Euclidean: case EuclideanSq: for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - + for(int yi = yr - 1; yi <= yr + 1; yi++) { int zPrimed = zPrimedBase; - + for(int zi = zr - 1; zi <= zr + 1; zi++) { int hash = hash(seed, xPrimed, yPrimed, zPrimed); int idx = hash & (255 << 2); - + double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - + double newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; - + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; @@ -426,20 +427,20 @@ public class CellularSampler extends NoiseFunction { case Manhattan: for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - + for(int yi = yr - 1; yi <= yr + 1; yi++) { int zPrimed = zPrimedBase; - + for(int zi = zr - 1; zi <= zr + 1; zi++) { int hash = hash(seed, xPrimed, yPrimed, zPrimed); int idx = hash & (255 << 2); - + double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - + double newDistance = fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ); - + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; @@ -462,21 +463,21 @@ public class CellularSampler extends NoiseFunction { case Hybrid: for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - + for(int yi = yr - 1; yi <= yr + 1; yi++) { int zPrimed = zPrimedBase; - + for(int zi = zr - 1; zi <= zr + 1; zi++) { int hash = hash(seed, xPrimed, yPrimed, zPrimed); int idx = hash & (255 << 2); - + double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - + double newDistance = (fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ)) + - (vecX * vecX + vecY * vecY + vecZ * vecZ); - + (vecX * vecX + vecY * vecY + vecZ * vecZ); + distance1 = fastMax(fastMin(distance1, newDistance), distance0); if(newDistance < distance0) { distance0 = newDistance; @@ -500,14 +501,14 @@ public class CellularSampler extends NoiseFunction { default: break; } - + if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) { distance0 = fastSqrt(distance0); if(returnType != ReturnType.CellValue) { distance1 = fastSqrt(distance1); } } - + switch(returnType) { case CellValue: return closestHash * (1 / 2147483648.0); @@ -539,15 +540,15 @@ public class CellularSampler extends NoiseFunction { return 0; } } - + public enum DistanceFunction { Euclidean, EuclideanSq, Manhattan, Hybrid } - - + + public enum ReturnType { CellValue, Distance, diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java index 10833d194..eaea1382d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java @@ -5,16 +5,16 @@ package com.dfsek.terra.addons.noise.samplers.noise; */ public class ConstantSampler extends NoiseFunction { private final double constant; - + public ConstantSampler(double constant) { this.constant = constant; } - + @Override public double getNoiseRaw(long seed, double x, double y) { return constant; } - + @Override public double getNoiseRaw(long seed, double x, double y, double z) { return constant; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java index 469deec60..01011f58e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java @@ -5,37 +5,39 @@ import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; -import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; import java.util.Map; +import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; + + /** * NoiseSampler implementation using a Paralithic expression. */ public class ExpressionFunction extends NoiseFunction { private final Expression expression; - + public ExpressionFunction(Map functions, String eq, Map vars) throws ParseException { Parser p = new Parser(); Scope scope = new Scope(); - + scope.addInvocationVariable("x"); scope.addInvocationVariable("y"); scope.addInvocationVariable("z"); - + vars.forEach(scope::create); - + functions.forEach(p::registerFunction); - + expression = p.parse(eq, scope); frequency = 1; } - + @Override public double getNoiseRaw(long seed, double x, double y) { return expression.evaluate(new SeedContext(seed), x, 0, y); } - + @Override public double getNoiseRaw(long seed, double x, double y, double z) { return expression.evaluate(new SeedContext(seed), x, y, z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java index 00f1bde3d..fbe7afdae 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java @@ -1,8 +1,10 @@ package com.dfsek.terra.addons.noise.samplers.noise; -import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; import net.jafama.FastMath; +import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; + + public class GaborNoiseSampler extends NoiseFunction { private final WhiteNoiseSampler rand; private double k = 1.0; @@ -13,58 +15,21 @@ public class GaborNoiseSampler extends NoiseFunction { private boolean isotropic = true; private double impulsesPerKernel = 64d; private double impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius)); - private double impulsesPerCell = impulseDensity * kernelRadius * kernelRadius; private double g = FastMath.exp(-impulsesPerCell); - - + + public GaborNoiseSampler() { rand = new WhiteNoiseSampler(); } - - public void setIsotropic(boolean isotropic) { - this.isotropic = isotropic; - } - - public void setImpulsesPerKernel(double impulsesPerKernel) { - this.impulsesPerKernel = impulsesPerKernel; - recalculateRadiusAndDensity(); - } - - public void setA(double a) { - this.a = a; - recalculateRadiusAndDensity(); - } - - public void setFrequency0(double f0) { - this.f0 = f0; - } - - public void setRotation(double omega0) { - this.omega0 = Math.PI * omega0; - } - - public void setDeviation(double k) { - this.k = k; - } - + private void recalculateRadiusAndDensity() { kernelRadius = (FastMath.sqrt(-FastMath.log(0.05) / Math.PI) / this.a); impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius)); impulsesPerCell = impulseDensity * kernelRadius * kernelRadius; g = FastMath.exp(-impulsesPerCell); } - - @Override - public double getNoiseRaw(long seed, double x, double z) { - return gaborNoise(seed, x, z); - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return gaborNoise(seed, x, z); - } - + private double gaborNoise(long seed, double x, double y) { x /= kernelRadius; y /= kernelRadius; @@ -80,25 +45,63 @@ public class GaborNoiseSampler extends NoiseFunction { } return noise; } - + private double calculateCell(long seed, int xi, int yi, double x, double y) { long mashedSeed = murmur64(31L * xi + yi) + seed; - + double gaussianSource = (rand.getNoiseRaw(mashedSeed++) + 1) / 2; int impulses = 0; while(gaussianSource > g) { impulses++; gaussianSource *= (rand.getNoiseRaw(mashedSeed++) + 1) / 2; } - + double noise = 0; for(int i = 0; i < impulses; i++) { - noise += rand.getNoiseRaw(mashedSeed++) * gabor(isotropic ? (rand.getNoiseRaw(mashedSeed++) + 1) * Math.PI : omega0, x * kernelRadius, y * kernelRadius); + noise += rand.getNoiseRaw(mashedSeed++) * gabor(isotropic ? (rand.getNoiseRaw(mashedSeed++) + 1) * Math.PI : omega0, + x * kernelRadius, y * kernelRadius); } return noise; } - + private double gabor(double omega_0, double x, double y) { - return k * (FastMath.exp(-Math.PI * (a * a) * (x * x + y * y)) * fastCos(2 * Math.PI * f0 * (x * fastCos(omega_0) + y * fastSin(omega_0)))); + return k * (FastMath.exp(-Math.PI * (a * a) * (x * x + y * y)) * fastCos(2 * Math.PI * f0 * (x * fastCos(omega_0) + y * fastSin( + omega_0)))); + } + + public void setA(double a) { + this.a = a; + recalculateRadiusAndDensity(); + } + + public void setDeviation(double k) { + this.k = k; + } + + public void setFrequency0(double f0) { + this.f0 = f0; + } + + public void setImpulsesPerKernel(double impulsesPerKernel) { + this.impulsesPerKernel = impulsesPerKernel; + recalculateRadiusAndDensity(); + } + + public void setIsotropic(boolean isotropic) { + this.isotropic = isotropic; + } + + public void setRotation(double omega0) { + this.omega0 = Math.PI * omega0; + } + + @Override + public double getNoiseRaw(long seed, double x, double z) { + return gaborNoise(seed, x, z); + } + + @Override + public double getNoiseRaw(long seed, double x, double y, double z) { + return gaborNoise(seed, x, z); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java index c5b20abe6..d3b6a3045 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java @@ -1,8 +1,10 @@ package com.dfsek.terra.addons.noise.samplers.noise; -import com.dfsek.terra.api.noise.NoiseSampler; import net.jafama.FastMath; +import com.dfsek.terra.api.noise.NoiseSampler; + + @SuppressWarnings("ManualMinMaxCalculation") public abstract class NoiseFunction implements NoiseSampler { // Hashing @@ -12,90 +14,84 @@ public abstract class NoiseFunction implements NoiseSampler { static final int precision = 100; static final int modulus = 360 * precision; static final double[] sin = new double[360 * 100]; // lookup table - static { for(int i = 0; i < sin.length; i++) { sin[i] = (float) Math.sin((double) (i) / (precision)); } } - protected double frequency = 0.02d; - protected long salt; - - public void setSalt(long salt) { - this.salt = salt; - } - + public NoiseFunction() { this.salt = 0; } - + protected static int fastFloor(double f) { return f >= 0 ? (int) f : (int) f - 1; } - + protected static int hash(int seed, int xPrimed, int yPrimed, int zPrimed) { int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; - + hash *= 0x27d4eb2d; return hash; } - + protected static int hash(int seed, int xPrimed, int yPrimed) { int hash = seed ^ xPrimed ^ yPrimed; - + hash *= 0x27d4eb2d; return hash; } - + protected static int fastRound(double f) { return f >= 0 ? (int) (f + 0.5f) : (int) (f - 0.5); } - + protected static double lerp(double a, double b, double t) { return a + t * (b - a); } - + protected static double interpHermite(double t) { return t * t * (3 - 2 * t); } - + protected static double interpQuintic(double t) { return t * t * t * (t * (t * 6 - 15) + 10); } - + protected static double cubicLerp(double a, double b, double c, double d, double t) { double p = (d - c) - (a - b); return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; } - + protected static double fastMin(double a, double b) { return a < b ? a : b; } - + protected static double fastMax(double a, double b) { return a > b ? a : b; } - + protected static double fastAbs(double f) { return f < 0 ? -f : f; } - + protected static double fastSqrt(double f) { return FastMath.sqrt(f); } - + protected static int fastCeil(double f) { int i = (int) f; if(i < f) i++; return i; } - + /** * Murmur64 hashing function * * @param h Input value + * * @return Hashed value */ protected static long murmur64(long h) { @@ -106,38 +102,42 @@ public abstract class NoiseFunction implements NoiseSampler { h ^= h >>> 33; return h; } - - private static double sinLookup(int a) { - return a >= 0 ? sin[a % (modulus)] : -sin[-a % (modulus)]; - } - + protected static double fastSin(double a) { return sinLookup((int) (a * precision + 0.5f)); } - + protected static double fastCos(double a) { return sinLookup((int) ((a + Math.PI / 2) * precision + 0.5f)); } - + + private static double sinLookup(int a) { + return a >= 0 ? sin[a % (modulus)] : -sin[-a % (modulus)]; + } + + public void setSalt(long salt) { + this.salt = salt; + } + public double getFrequency() { return frequency; } - + public void setFrequency(double frequency) { this.frequency = frequency; } - + @Override public double getNoiseSeeded(long seed, double x, double y) { return getNoiseRaw(seed + salt, x * frequency, y * frequency); } - + @Override public double getNoiseSeeded(long seed, double x, double y, double z) { return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency); } - + public abstract double getNoiseRaw(long seed, double x, double y); - + public abstract double getNoiseRaw(long seed, double x, double y, double z); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java index 556c1dd61..f7e636ae6 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java @@ -2,45 +2,46 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; + public class BrownianMotionSampler extends FractalNoiseFunction { public BrownianMotionSampler(NoiseSampler input) { super(input); } - + @Override public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; - + for(int i = 0; i < octaves; i++) { double noise = input.getNoiseSeeded(seed++, x, y); sum += noise * amp; amp *= lerp(1.0, fastMin(noise + 1, 2) * 0.5, weightedStrength); - + x *= lacunarity; y *= lacunarity; amp *= gain; } - + return sum; } - + @Override public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; - + for(int i = 0; i < octaves; i++) { double noise = input.getNoiseSeeded(seed++, x, y, z); sum += noise * amp; amp *= lerp(1.0, (noise + 1) * 0.5, weightedStrength); - + x *= lacunarity; y *= lacunarity; z *= lacunarity; amp *= gain; } - + return sum; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java index 32b110610..0f3455c72 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.noise.NoiseSampler; + public abstract class FractalNoiseFunction extends NoiseFunction { protected final NoiseSampler input; protected double fractalBounding = 1 / 1.75; @@ -10,16 +11,12 @@ public abstract class FractalNoiseFunction extends NoiseFunction { protected double gain = 0.5; protected double lacunarity = 2.0d; protected double weightedStrength = 0.0d; - + public FractalNoiseFunction(NoiseSampler input) { this.input = input; frequency = 1; } - - public void setWeightedStrength(double weightedStrength) { - this.weightedStrength = weightedStrength; - } - + protected void calculateFractalBounding() { double gain = fastAbs(this.gain); double amp = gain; @@ -30,18 +27,22 @@ public abstract class FractalNoiseFunction extends NoiseFunction { } fractalBounding = 1 / ampFractal; } - - public void setOctaves(int octaves) { - this.octaves = octaves; - calculateFractalBounding(); - } - + public void setGain(double gain) { this.gain = gain; calculateFractalBounding(); } - + public void setLacunarity(double lacunarity) { this.lacunarity = lacunarity; } + + public void setOctaves(int octaves) { + this.octaves = octaves; + calculateFractalBounding(); + } + + public void setWeightedStrength(double weightedStrength) { + this.weightedStrength = weightedStrength; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java index 72db1b168..3c712db61 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java @@ -2,57 +2,58 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; + public class PingPongSampler extends FractalNoiseFunction { private double pingPongStrength = 2.0; - + public PingPongSampler(NoiseSampler input) { super(input); } - - + + private static double pingPong(double t) { t -= (int) (t * 0.5f) << 1; return t < 1 ? t : 2 - t; } - + public void setPingPongStrength(double strength) { this.pingPongStrength = strength; } - + @Override public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; - + for(int i = 0; i < octaves; i++) { double noise = pingPong((input.getNoiseSeeded(seed++, x, y) + 1) * pingPongStrength); sum += (noise - 0.5) * 2 * amp; amp *= lerp(1.0, noise, weightedStrength); - + x *= lacunarity; y *= lacunarity; amp *= gain; } - + return sum; } - + @Override public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; - + for(int i = 0; i < octaves; i++) { double noise = pingPong((input.getNoiseSeeded(seed++, x, y, z) + 1) * pingPongStrength); sum += (noise - 0.5) * 2 * amp; amp *= lerp(1.0, noise, weightedStrength); - + x *= lacunarity; y *= lacunarity; z *= lacunarity; amp *= gain; } - + return sum; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java index f316cb6f2..6c6f53592 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java @@ -2,46 +2,47 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; -public class RidgedFractalSampler extends FractalNoiseFunction { +public class RidgedFractalSampler extends FractalNoiseFunction { + public RidgedFractalSampler(NoiseSampler input) { super(input); } - + @Override public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; - + for(int i = 0; i < octaves; i++) { double noise = fastAbs(input.getNoiseSeeded(seed++, x, y)); sum += (noise * -2 + 1) * amp; amp *= lerp(1.0, 1 - noise, weightedStrength); - + x *= lacunarity; y *= lacunarity; amp *= gain; } - + return sum; } - + @Override public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; - + for(int i = 0; i < octaves; i++) { double noise = fastAbs(input.getNoiseSeeded(seed++, x, y, z)); sum += (noise * -2 + 1) * amp; amp *= lerp(1.0, 1 - noise, weightedStrength); - + x *= lacunarity; y *= lacunarity; z *= lacunarity; amp *= gain; } - + return sum; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java index 154015af2..159dfffc0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java @@ -2,16 +2,17 @@ package com.dfsek.terra.addons.noise.samplers.noise.random; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; + /** * NoiseSampler implementation to provide random, normally distributed (Gaussian) noise. */ public class GaussianNoiseSampler extends NoiseFunction { private final WhiteNoiseSampler whiteNoiseSampler; // Back with a white noise sampler. - + public GaussianNoiseSampler() { whiteNoiseSampler = new WhiteNoiseSampler(); } - + @Override public double getNoiseRaw(long seed, double x, double y) { double v1, v2, s; @@ -23,7 +24,7 @@ public class GaussianNoiseSampler extends NoiseFunction { double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s); return v1 * multiplier; } - + @Override public double getNoiseRaw(long seed, double x, double y, double z) { double v1, v2, s; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java index 8486ec12f..8ec5d0d2b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java @@ -2,50 +2,52 @@ package com.dfsek.terra.addons.noise.samplers.noise.random; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; + /** * NoiseSampler implementation to produce random, uniformly distributed (white) noise. */ public class WhiteNoiseSampler extends NoiseFunction { - private static final long POSITIVE_POW1 = 0b01111111111L << 52; // Bits that when applied to the exponent/sign section of a double, produce a positive number with a power of 1. - + private static final long POSITIVE_POW1 = 0b01111111111L << 52; + // Bits that when applied to the exponent/sign section of a double, produce a positive number with a power of 1. + public WhiteNoiseSampler() { } - - public double getNoiseRaw(long seed) { - return (Double.longBitsToDouble((murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2; - } - - @Override - public double getNoiseRaw(long seed, double x, double y) { - return (getNoiseUnmapped(seed, x, y) - 1.5) * 2; - } - - @Override - public double getNoiseRaw(long seed, double x, double y, double z) { - return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2; - } - - public double getNoiseUnmapped(long seed, double x, double y, double z) { - long base = ((randomBits(seed, x, y, z)) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent - return Double.longBitsToDouble(base); - } - - public double getNoiseUnmapped(long seed, double x, double y) { - long base = (randomBits(seed, x, y) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent - return Double.longBitsToDouble(base); - } - + public long randomBits(long seed, double x, double y, double z) { long hashX = Double.doubleToRawLongBits(x) ^ seed; long hashZ = Double.doubleToRawLongBits(y) ^ seed; long hash = (((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed) + Double.doubleToRawLongBits(z); return murmur64(hash); } - + public long randomBits(long seed, double x, double y) { long hashX = Double.doubleToRawLongBits(x) ^ seed; long hashZ = Double.doubleToRawLongBits(y) ^ seed; long hash = ((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed; return murmur64(hash); } + + public double getNoiseRaw(long seed) { + return (Double.longBitsToDouble((murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2; + } + + @Override + public double getNoiseRaw(long seed, double x, double y) { + return (getNoiseUnmapped(seed, x, y) - 1.5) * 2; + } + + @Override + public double getNoiseRaw(long seed, double x, double y, double z) { + return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2; + } + + public double getNoiseUnmapped(long seed, double x, double y, double z) { + long base = ((randomBits(seed, x, y, z)) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent + return Double.longBitsToDouble(base); + } + + public double getNoiseUnmapped(long seed, double x, double y) { + long base = (randomBits(seed, x, y) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent + return Double.longBitsToDouble(base); + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index eb9a152f4..24c36cb34 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -9,38 +9,38 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { public double getNoiseRaw(long sl, double x, double y) { int seed = (int) sl; // 2D OpenSimplex2S case is a modified 2D simplex noise. - + final double SQRT3 = 1.7320508075688772935274463415059; final double G2 = (3 - SQRT3) / 6; - + final double F2 = 0.5f * (SQRT3 - 1); double s = (x + y) * F2; x += s; y += s; - - + + int i = fastFloor(x); int j = fastFloor(y); double xi = x - i; double yi = y - j; - + i *= PRIME_X; j *= PRIME_Y; int i1 = i + PRIME_X; int j1 = j + PRIME_Y; - + double t = (xi + yi) * G2; double x0 = xi - t; double y0 = yi - t; - + double a0 = (2.0 / 3.0) - x0 * x0 - y0 * y0; double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i, j, x0, y0); - + double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); double x1 = x0 - (1 - 2 * G2); double y1 = y0 - (1 - 2 * G2); value += (a1 * a1) * (a1 * a1) * gradCoord(seed, i1, j1, x1, y1); - + // Nested conditionals were faster than compact bit logic/arithmetic. double xmyi = xi - yi; if(t > G2) { @@ -59,7 +59,7 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j + PRIME_Y, x2, y2); } } - + if(yi - xmyi > 1) { double x3 = x0 + (3 * G2 - 1); double y3 = y0 + (3 * G2 - 2); @@ -91,7 +91,7 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + PRIME_X, j, x2, y2); } } - + if(yi < xmyi) { double x2 = x0 - G2; double y2 = y0 - (G2 - 1); @@ -108,10 +108,10 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { } } } - + return value * 18.24196194486065; } - + @Override @SuppressWarnings("NumericOverflow") public double getNoiseRaw(long sl, double x, double y, double z) { @@ -122,59 +122,62 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { x = r - x; y = r - y; z = r - z; - - + + int i = fastFloor(x); int j = fastFloor(y); int k = fastFloor(z); double xi = x - i; double yi = y - j; double zi = z - k; - + i *= PRIME_X; j *= PRIME_Y; k *= PRIME_Z; int seed2 = seed + 1293373; - + int xNMask = (int) (-0.5 - xi); int yNMask = (int) (-0.5 - yi); int zNMask = (int) (-0.5 - zi); - + double x0 = xi + xNMask; double y0 = yi + yNMask; double z0 = zi + zNMask; double a0 = 0.75 - x0 * x0 - y0 * y0 - z0 * z0; - double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, y0, - z0); - + double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, + y0, + z0); + double x1 = xi - 0.5; double y1 = yi - 0.5; double z1 = zi - 0.5; double a1 = 0.75 - x1 * x1 - y1 * y1 - z1 * z1; value += (a1 * a1) * (a1 * a1) * gradCoord(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z, x1, y1, z1); - + double xAFlipMask0 = ((xNMask | 1) << 1) * x1; double yAFlipMask0 = ((yNMask | 1) << 1) * y1; double zAFlipMask0 = ((zNMask | 1) << 1) * z1; double xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0; double yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0; double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0; - + boolean skip5 = false; double a2 = xAFlipMask0 + a0; if(a2 > 0) { double x2 = x0 - (xNMask | 1); - value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x2, y0, - z0); + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x2, + y0, + z0); } else { double a3 = yAFlipMask0 + zAFlipMask0 + a0; if(a3 > 0) { double y3 = y0 - (yNMask | 1); double z3 = z0 - (zNMask | 1); - value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x0, - y3, z3); + value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), + x0, + y3, z3); } - + double a4 = xAFlipMask1 + a1; if(a4 > 0) { double x4 = (xNMask | 1) + x1; @@ -182,22 +185,24 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { skip5 = true; } } - + boolean skip9 = false; double a6 = yAFlipMask0 + a0; if(a6 > 0) { double y6 = y0 - (yNMask | 1); - value += (a6 * a6) * (a6 * a6) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, y6, - z0); + value += (a6 * a6) * (a6 * a6) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, + y6, + z0); } else { double a7 = xAFlipMask0 + zAFlipMask0 + a0; if(a7 > 0) { double x7 = x0 - (xNMask | 1); double z7 = z0 - (zNMask | 1); - value += (a7 * a7) * (a7 * a7) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x7, - y0, z7); + value += (a7 * a7) * (a7 * a7) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), + x7, + y0, z7); } - + double a8 = yAFlipMask1 + a1; if(a8 > 0) { double y8 = (yNMask | 1) + y1; @@ -205,22 +210,24 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { skip9 = true; } } - + boolean skipD = false; double aA = zAFlipMask0 + a0; if(aA > 0) { double zA = z0 - (zNMask | 1); - value += (aA * aA) * (aA * aA) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x0, y0, - zA); + value += (aA * aA) * (aA * aA) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x0, + y0, + zA); } else { double aB = xAFlipMask0 + yAFlipMask0 + a0; if(aB > 0) { double xB = x0 - (xNMask | 1); double yB = y0 - (yNMask | 1); - value += (aB * aB) * (aB * aB) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), xB, - yB, z0); + value += (aB * aB) * (aB * aB) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), + xB, + yB, z0); } - + double aC = zAFlipMask1 + a1; if(aC > 0) { double zC = (zNMask | 1) + z1; @@ -228,37 +235,38 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { skipD = true; } } - + if(!skip5) { double a5 = yAFlipMask1 + zAFlipMask1 + a1; if(a5 > 0) { double y5 = (yNMask | 1) + y1; double z5 = (zNMask | 1) + z1; value += (a5 * a5) * (a5 * a5) * gradCoord(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1)), - x1, y5, z5); + x1, y5, z5); } } - + if(!skip9) { double a9 = xAFlipMask1 + zAFlipMask1 + a1; if(a9 > 0) { double x9 = (xNMask | 1) + x1; double z9 = (zNMask | 1) + z1; - value += (a9 * a9) * (a9 * a9) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), x9, - y1, z9); + value += (a9 * a9) * (a9 * a9) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), + x9, + y1, z9); } } - + if(!skipD) { double aD = xAFlipMask1 + yAFlipMask1 + a1; if(aD > 0) { double xD = (xNMask | 1) + x1; double yD = (yNMask | 1) + y1; value += (aD * aD) * (aD * aD) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, - xD, yD, z1); + xD, yD, z1); } } - + return value * 9.046026385208288; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index c4379b212..410176b2e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -5,39 +5,39 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; */ public class OpenSimplex2Sampler extends SimplexStyleSampler { private static final double SQRT3 = 1.7320508075688772935274463415059; - + @Override public double getNoiseRaw(long sl, double x, double y) { int seed = (int) sl; // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. final double G2 = (3 - SQRT3) / 6; - + final double F2 = 0.5f * (SQRT3 - 1); double s = (x + y) * F2; x += s; y += s; - - + + int i = fastFloor(x); int j = fastFloor(y); double xi = x - i; double yi = y - j; - + double t = (xi + yi) * G2; double x0 = xi - t; double y0 = yi - t; - + i *= PRIME_X; j *= PRIME_Y; - + double n0, n1, n2; - + double a = 0.5 - x0 * x0 - y0 * y0; if(a <= 0) n0 = 0; else { n0 = (a * a) * (a * a) * gradCoord(seed, i, j, x0, y0); } - + double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); if(c <= 0) n2 = 0; else { @@ -45,7 +45,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { double y2 = y0 + (2 * G2 - 1); n2 = (c * c) * (c * c) * gradCoord(seed, i + PRIME_X, j + PRIME_Y, x2, y2); } - + if(y0 > x0) { double x1 = x0 + G2; double y1 = y0 + (G2 - 1); @@ -63,10 +63,10 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { n1 = (b * b) * (b * b) * gradCoord(seed, i + PRIME_X, j, x1, y1); } } - + return (n0 + n1 + n2) * 99.83685446303647f; } - + @Override public double getNoiseRaw(long sl, double x, double y, double z) { int seed = (int) sl; @@ -76,35 +76,35 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { x = r - x; y = r - y; z = r - z; - - + + int i = fastRound(x); int j = fastRound(y); int k = fastRound(z); double x0 = x - i; double y0 = y - j; double z0 = z - k; - + int xNSign = (int) (-1.0 - x0) | 1; int yNSign = (int) (-1.0 - y0) | 1; int zNSign = (int) (-1.0 - z0) | 1; - + double ax0 = xNSign * -x0; double ay0 = yNSign * -y0; double az0 = zNSign * -z0; - + i *= PRIME_X; j *= PRIME_Y; k *= PRIME_Z; - + double value = 0; double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - + for(int l = 0; ; l++) { if(a > 0) { value += (a * a) * (a * a) * gradCoord(seed, i, j, k, x0, y0, z0); } - + if(ax0 >= ay0 && ax0 >= az0) { double b = a + ax0 + ax0; if(b > 1) { @@ -124,30 +124,30 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { value += (b * b) * (b * b) * gradCoord(seed, i, j, k - zNSign * PRIME_Z, x0, y0, z0 + zNSign); } } - + if(l == 1) break; - + ax0 = 0.5 - ax0; ay0 = 0.5 - ay0; az0 = 0.5 - az0; - + x0 = xNSign * ax0; y0 = yNSign * ay0; z0 = zNSign * az0; - + a += (0.75 - ax0) - (ay0 + az0); - + i += (xNSign >> 1) & PRIME_X; j += (yNSign >> 1) & PRIME_Y; k += (zNSign >> 1) & PRIME_Z; - + xNSign = -xNSign; yNSign = -yNSign; zNSign = -zNSign; - + seed = ~seed; } - + return value * 32.69428253173828125; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java index 044029a39..047e02ce5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java @@ -9,59 +9,59 @@ public class PerlinSampler extends SimplexStyleSampler { int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); - + double xd0 = x - x0; double yd0 = y - y0; double xd1 = xd0 - 1; double yd1 = yd0 - 1; - + double xs = interpQuintic(xd0); double ys = interpQuintic(yd0); - + x0 *= PRIME_X; y0 *= PRIME_Y; int x1 = x0 + PRIME_X; int y1 = y0 + PRIME_Y; - + double xf0 = lerp(gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0), xs); double xf1 = lerp(gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1), xs); - + return lerp(xf0, xf1, ys) * 1.4247691104677813; } - + @Override public double getNoiseRaw(long sl, double x, double y, double z) { int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); int z0 = fastFloor(z); - + double xd0 = x - x0; double yd0 = y - y0; double zd0 = z - z0; double xd1 = xd0 - 1; double yd1 = yd0 - 1; double zd1 = zd0 - 1; - + double xs = interpQuintic(xd0); double ys = interpQuintic(yd0); double zs = interpQuintic(zd0); - + x0 *= PRIME_X; y0 *= PRIME_Y; z0 *= PRIME_Z; int x1 = x0 + PRIME_X; int y1 = y0 + PRIME_Y; int z1 = z0 + PRIME_Z; - + double xf00 = lerp(gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs); double xf10 = lerp(gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs); double xf01 = lerp(gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs); double xf11 = lerp(gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs); - + double yf0 = lerp(xf00, xf10, ys); double yf1 = lerp(xf01, xf11, ys); - + return lerp(yf0, yf1, zs) * 0.964921414852142333984375; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java index 045441534..dfaaf5bc6 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java @@ -4,66 +4,66 @@ public class SimplexSampler extends SimplexStyleSampler { private static final Double2[] GRAD_2D = { new Double2(-1, -1), new Double2(1, -1), new Double2(-1, 1), new Double2(1, 1), new Double2(0, -1), new Double2(-1, 0), new Double2(0, 1), new Double2(1, 0), - }; + }; private static final Double3[] GRAD_3D = { new Double3(1, 1, 0), new Double3(-1, 1, 0), new Double3(1, -1, 0), new Double3(-1, -1, 0), new Double3(1, 0, 1), new Double3(-1, 0, 1), new Double3(1, 0, -1), new Double3(-1, 0, -1), new Double3(0, 1, 1), new Double3(0, -1, 1), new Double3(0, 1, -1), new Double3(0, -1, -1), new Double3(1, 1, 0), new Double3(0, -1, 1), new Double3(-1, 1, 0), new Double3(0, -1, -1), - }; - + }; + private static final double F2 = 1.0 / 2.0; private static final double F3 = (1.0 / 3.0); private static final double G2 = 1.0 / 4.0; private static final double G3 = (1.0 / 6.0); private static final double G33 = G3 * 3 - 1; - + private static final int X_PRIME = 1619; private static final int Y_PRIME = 31337; private static final int Z_PRIME = 6971; - - + + private static double gradCoord3D(int seed, int x, int y, int z, double xd, double yd, double zd) { int hash = seed; hash ^= X_PRIME * x; hash ^= Y_PRIME * y; hash ^= Z_PRIME * z; - + hash = hash * hash * hash * 60493; hash = (hash >> 13) ^ hash; - + Double3 g = GRAD_3D[hash & 15]; - + return xd * g.x + yd * g.y + zd * g.z; } - + private static double gradCoord2D(int seed, int x, int y, double xd, double yd) { int hash = seed; hash ^= X_PRIME * x; hash ^= Y_PRIME * y; - + hash = hash * hash * hash * 60493; hash = (hash >> 13) ^ hash; - + Double2 g = GRAD_2D[hash & 7]; - + return xd * g.x + yd * g.y; } - + @Override public double getNoiseRaw(long sl, double x, double y) { int seed = (int) sl; double t = (x + y) * F2; int i = fastFloor(x + t); int j = fastFloor(y + t); - + t = (i + j) * G2; double X0 = i - t; double Y0 = j - t; - + double x0 = x - X0; double y0 = y - Y0; - + int i1, j1; if(x0 > y0) { i1 = 1; @@ -72,14 +72,14 @@ public class SimplexSampler extends SimplexStyleSampler { i1 = 0; j1 = 1; } - + double x1 = x0 - i1 + G2; double y1 = y0 - j1 + G2; double x2 = x0 - 1 + F2; double y2 = y0 - 1 + F2; - + double n0, n1, n2; - + t = 0.5 - x0 * x0 - y0 * y0; if(t < 0) { n0 = 0; @@ -87,7 +87,7 @@ public class SimplexSampler extends SimplexStyleSampler { t *= t; n0 = t * t * gradCoord2D(seed, i, j, x0, y0); } - + t = 0.5 - x1 * x1 - y1 * y1; if(t < 0) { n1 = 0; @@ -95,7 +95,7 @@ public class SimplexSampler extends SimplexStyleSampler { t *= t; n1 = t * t * gradCoord2D(seed, i + i1, j + j1, x1, y1); } - + t = 0.5 - x2 * x2 - y2 * y2; if(t < 0) { n2 = 0; @@ -103,10 +103,10 @@ public class SimplexSampler extends SimplexStyleSampler { t *= t; n2 = t * t * gradCoord2D(seed, i + 1, j + 1, x2, y2); } - + return 50 * (n0 + n1 + n2); } - + @Override public double getNoiseRaw(long sl, double x, double y, double z) { int seed = (int) sl; @@ -114,15 +114,15 @@ public class SimplexSampler extends SimplexStyleSampler { int i = fastFloor(x + t); int j = fastFloor(y + t); int k = fastFloor(z + t); - + t = (i + j + k) * G3; double x0 = x - (i - t); double y0 = y - (j - t); double z0 = z - (k - t); - + int i1, j1, k1; int i2, j2, k2; - + if(x0 >= y0) { if(y0 >= z0) { i1 = 1; @@ -173,7 +173,7 @@ public class SimplexSampler extends SimplexStyleSampler { k2 = 0; } } - + double x1 = x0 - i1 + G3; double y1 = y0 - j1 + G3; double z1 = z0 - k1 + G3; @@ -183,16 +183,16 @@ public class SimplexSampler extends SimplexStyleSampler { double x3 = x0 + G33; double y3 = y0 + G33; double z3 = z0 + G33; - + double n0, n1, n2, n3; - + t = 0.6 - x0 * x0 - y0 * y0 - z0 * z0; if(t < 0) n0 = 0; else { t *= t; n0 = t * t * gradCoord3D(seed, i, j, k, x0, y0, z0); } - + t = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; if(t < 0) { n1 = 0; @@ -200,7 +200,7 @@ public class SimplexSampler extends SimplexStyleSampler { t *= t; n1 = t * t * gradCoord3D(seed, i + i1, j + j1, k + k1, x1, y1, z1); } - + t = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; if(t < 0) { n2 = 0; @@ -208,7 +208,7 @@ public class SimplexSampler extends SimplexStyleSampler { t *= t; n2 = t * t * gradCoord3D(seed, i + i2, j + j2, k + k2, x2, y2, z2); } - + t = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; if(t < 0) { n3 = 0; @@ -216,22 +216,23 @@ public class SimplexSampler extends SimplexStyleSampler { t *= t; n3 = t * t * gradCoord3D(seed, i + 1, j + 1, k + 1, x3, y3, z3); } - + return 32 * (n0 + n1 + n2 + n3); } - + private static class Double2 { public final double x, y; - + public Double2(double x, double y) { this.x = x; this.y = y; } } - + + private static class Double3 { public final double x, y, z; - + public Double3(double x, double y, double z) { this.x = x; this.y = y; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java index f6183e1ec..d924f2833 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java @@ -2,6 +2,7 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; + /** * Abstract NoiseSampler implementation for simplex-style noise functions. */ @@ -50,8 +51,8 @@ public abstract class SimplexStyleSampler extends NoiseFunction { 0.38268343236509d, 0.923879532511287d, 0.923879532511287d, 0.38268343236509d, 0.923879532511287d, -0.38268343236509d, 0.38268343236509d, -0.923879532511287d, -0.38268343236509d, -0.923879532511287d, -0.923879532511287d, -0.38268343236509d, -0.923879532511287d, 0.38268343236509d, -0.38268343236509d, 0.923879532511287d, - }; - + }; + protected static final double[] GRADIENTS_3D = { 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, @@ -70,27 +71,27 @@ public abstract class SimplexStyleSampler extends NoiseFunction { 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 }; - + protected static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { int hash = hash(seed, xPrimed, yPrimed); hash ^= hash >> 15; hash &= 127 << 1; - + double xg = GRADIENTS_2_D[hash]; double yg = GRADIENTS_2_D[hash | 1]; - + return xd * xg + yd * yg; } - + protected static double gradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { int hash = hash(seed, xPrimed, yPrimed, zPrimed); hash ^= hash >> 15; hash &= 63 << 2; - + double xg = GRADIENTS_3D[hash]; double yg = GRADIENTS_3D[hash | 1]; double zg = GRADIENTS_3D[hash | 2]; - + return xd * xg + yd * yg + zd * zg; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java index 3f19dc41e..d490126f1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java @@ -6,10 +6,10 @@ public class ValueCubicSampler extends ValueStyleNoise { int seed = (int) sl; int x1 = fastFloor(x); int y1 = fastFloor(y); - + double xs = x - x1; double ys = y - y1; - + x1 *= PRIME_X; y1 *= PRIME_Y; int x0 = x1 - PRIME_X; @@ -18,34 +18,34 @@ public class ValueCubicSampler extends ValueStyleNoise { int y2 = y1 + PRIME_Y; int x3 = x1 + (PRIME_X << 1); int y3 = y1 + (PRIME_Y << 1); - + return cubicLerp( cubicLerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), valCoord(seed, x2, y0), valCoord(seed, x3, y0), - xs), + xs), cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1), - xs), + xs), cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2), - xs), + xs), cubicLerp(valCoord(seed, x0, y3), valCoord(seed, x1, y3), valCoord(seed, x2, y3), valCoord(seed, x3, y3), - xs), + xs), ys) * (1 / (1.5 * 1.5)); } - + @Override public double getNoiseRaw(long sl, double x, double y, double z) { int seed = (int) sl; int x1 = fastFloor(x); int y1 = fastFloor(y); int z1 = fastFloor(z); - + double xs = x - x1; double ys = y - y1; double zs = z - z1; - + x1 *= PRIME_X; y1 *= PRIME_Y; z1 *= PRIME_Z; - + int x0 = x1 - PRIME_X; int y0 = y1 - PRIME_Y; int z0 = z1 - PRIME_Z; @@ -55,47 +55,47 @@ public class ValueCubicSampler extends ValueStyleNoise { int x3 = x1 + (PRIME_X << 1); int y3 = y1 + (PRIME_Y << 1); int z3 = z1 + (PRIME_Z << 1); - + return cubicLerp( cubicLerp( cubicLerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), valCoord(seed, x2, y0, z0), - valCoord(seed, x3, y0, z0), xs), + valCoord(seed, x3, y0, z0), xs), cubicLerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), valCoord(seed, x2, y1, z0), - valCoord(seed, x3, y1, z0), xs), + valCoord(seed, x3, y1, z0), xs), cubicLerp(valCoord(seed, x0, y2, z0), valCoord(seed, x1, y2, z0), valCoord(seed, x2, y2, z0), - valCoord(seed, x3, y2, z0), xs), + valCoord(seed, x3, y2, z0), xs), cubicLerp(valCoord(seed, x0, y3, z0), valCoord(seed, x1, y3, z0), valCoord(seed, x2, y3, z0), - valCoord(seed, x3, y3, z0), xs), + valCoord(seed, x3, y3, z0), xs), ys), cubicLerp( cubicLerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), valCoord(seed, x2, y0, z1), - valCoord(seed, x3, y0, z1), xs), + valCoord(seed, x3, y0, z1), xs), cubicLerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), valCoord(seed, x2, y1, z1), - valCoord(seed, x3, y1, z1), xs), + valCoord(seed, x3, y1, z1), xs), cubicLerp(valCoord(seed, x0, y2, z1), valCoord(seed, x1, y2, z1), valCoord(seed, x2, y2, z1), - valCoord(seed, x3, y2, z1), xs), + valCoord(seed, x3, y2, z1), xs), cubicLerp(valCoord(seed, x0, y3, z1), valCoord(seed, x1, y3, z1), valCoord(seed, x2, y3, z1), - valCoord(seed, x3, y3, z1), xs), + valCoord(seed, x3, y3, z1), xs), ys), cubicLerp( cubicLerp(valCoord(seed, x0, y0, z2), valCoord(seed, x1, y0, z2), valCoord(seed, x2, y0, z2), - valCoord(seed, x3, y0, z2), xs), + valCoord(seed, x3, y0, z2), xs), cubicLerp(valCoord(seed, x0, y1, z2), valCoord(seed, x1, y1, z2), valCoord(seed, x2, y1, z2), - valCoord(seed, x3, y1, z2), xs), + valCoord(seed, x3, y1, z2), xs), cubicLerp(valCoord(seed, x0, y2, z2), valCoord(seed, x1, y2, z2), valCoord(seed, x2, y2, z2), - valCoord(seed, x3, y2, z2), xs), + valCoord(seed, x3, y2, z2), xs), cubicLerp(valCoord(seed, x0, y3, z2), valCoord(seed, x1, y3, z2), valCoord(seed, x2, y3, z2), - valCoord(seed, x3, y3, z2), xs), + valCoord(seed, x3, y3, z2), xs), ys), cubicLerp( cubicLerp(valCoord(seed, x0, y0, z3), valCoord(seed, x1, y0, z3), valCoord(seed, x2, y0, z3), - valCoord(seed, x3, y0, z3), xs), + valCoord(seed, x3, y0, z3), xs), cubicLerp(valCoord(seed, x0, y1, z3), valCoord(seed, x1, y1, z3), valCoord(seed, x2, y1, z3), - valCoord(seed, x3, y1, z3), xs), + valCoord(seed, x3, y1, z3), xs), cubicLerp(valCoord(seed, x0, y2, z3), valCoord(seed, x1, y2, z3), valCoord(seed, x2, y2, z3), - valCoord(seed, x3, y2, z3), xs), + valCoord(seed, x3, y2, z3), xs), cubicLerp(valCoord(seed, x0, y3, z3), valCoord(seed, x1, y3, z3), valCoord(seed, x2, y3, z3), - valCoord(seed, x3, y3, z3), xs), + valCoord(seed, x3, y3, z3), xs), ys), zs) * (1 / (1.5 * 1.5 * 1.5)); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java index 1258c9a00..15c200633 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java @@ -6,47 +6,47 @@ public class ValueSampler extends ValueStyleNoise { int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); - + double xs = interpHermite(x - x0); double ys = interpHermite(y - y0); - + x0 *= PRIME_X; y0 *= PRIME_Y; int x1 = x0 + PRIME_X; int y1 = y0 + PRIME_Y; - + double xf0 = lerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), xs); double xf1 = lerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), xs); - + return lerp(xf0, xf1, ys); } - + @Override public double getNoiseRaw(long sl, double x, double y, double z) { int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); int z0 = fastFloor(z); - + double xs = interpHermite(x - x0); double ys = interpHermite(y - y0); double zs = interpHermite(z - z0); - + x0 *= PRIME_X; y0 *= PRIME_Y; z0 *= PRIME_Z; int x1 = x0 + PRIME_X; int y1 = y0 + PRIME_Y; int z1 = z0 + PRIME_Z; - + double xf00 = lerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), xs); double xf10 = lerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), xs); double xf01 = lerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), xs); double xf11 = lerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), xs); - + double yf0 = lerp(xf00, xf10, ys); double yf1 = lerp(xf01, xf11, ys); - + return lerp(yf0, yf1, zs); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java index 8ed8f263c..74804a00b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java @@ -2,19 +2,20 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; -public abstract class ValueStyleNoise extends NoiseFunction { +public abstract class ValueStyleNoise extends NoiseFunction { + protected static double valCoord(int seed, int xPrimed, int yPrimed) { int hash = hash(seed, xPrimed, yPrimed); - + hash *= hash; hash ^= hash << 19; return hash * (1 / 2147483648.0); } - + protected static double valCoord(int seed, int xPrimed, int yPrimed, int zPrimed) { int hash = hash(seed, xPrimed, yPrimed, zPrimed); - + hash *= hash; hash ^= hash << 19; return hash * (1 / 2147483648.0); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashIntrinsic.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashIntrinsic.java index 104e7fe38..8e0def4ca 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashIntrinsic.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashIntrinsic.java @@ -35,6 +35,7 @@ package com.dfsek.terra.addons.noise.util; import java.io.Serializable; + public abstract class HashIntrinsic implements Serializable { public static final int FLOAT_EXP_BIT_MASK = 2139095040; public static final int FLOAT_SIGNIF_BIT_MASK = 8388607; @@ -48,7 +49,7 @@ public abstract class HashIntrinsic implements Serializable { protected int threshold; protected float loadFactor; protected int capMinus1; - + protected HashIntrinsic(int initialCapacity, float loadFactor) { if(initialCapacity <= 0) { throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); @@ -56,11 +57,11 @@ public abstract class HashIntrinsic implements Serializable { if(initialCapacity > 1073741824) { initialCapacity = 1073741824; } - + int capacity; for(capacity = 1; capacity < initialCapacity; capacity <<= 1) { } - + this.capMinus1 = capacity - 1; this.loadFactor = loadFactor; this.threshold = (int) ((float) capacity * loadFactor); @@ -68,51 +69,51 @@ public abstract class HashIntrinsic implements Serializable { throw new IllegalArgumentException("Illegal load factor: " + loadFactor); } } - - protected static int hashCodeLong(long value) { - return (int) (value ^ value >>> 32); - } - - protected static int hashCodeFloat(float value) { - return floatToIntBits(value); - } - - protected static int hashCodeDouble(double value) { - long bits = doubleToLongBits(value); - return (int) (bits ^ bits >>> 32); - } - + public static int floatToIntBits(float value) { int result = Float.floatToRawIntBits(value); if((result & 2139095040) == 2139095040 && (result & 8388607) != 0) { result = 2143289344; } - + return result; } - + public static long doubleToLongBits(double value) { long result = Double.doubleToRawLongBits(value); if((result & 9218868437227405312L) == 9218868437227405312L && (result & 4503599627370495L) != 0L) { result = 9221120237041090560L; } - + return result; } - + + protected static int hashCodeLong(long value) { + return (int) (value ^ value >>> 32); + } + + protected static int hashCodeFloat(float value) { + return floatToIntBits(value); + } + + protected static int hashCodeDouble(double value) { + long bits = doubleToLongBits(value); + return (int) (bits ^ bits >>> 32); + } + protected static int tableIndex(int hc, int lm1) { hc ^= hc >>> 20 ^ hc >>> 12; hc ^= hc >>> 7 ^ hc >>> 4; return hc & lm1; } - + public int size() { return this.size; } - + + public abstract void clear(); + public boolean isEmpty() { return this.size == 0; } - - public abstract void clear(); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashMapDoubleDouble.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashMapDoubleDouble.java index 9172c656b..d91193d92 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashMapDoubleDouble.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/util/HashMapDoubleDouble.java @@ -36,35 +36,36 @@ package com.dfsek.terra.addons.noise.util; import java.io.Serializable; import java.util.NoSuchElementException; + public class HashMapDoubleDouble extends HashIntrinsic { private static final long serialVersionUID = 2109458761298324234L; private HashMapDoubleDouble.Entry[] table; - + public HashMapDoubleDouble(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); this.table = this.createTable(this.capMinus1 + 1); } - + public HashMapDoubleDouble(int initialCapacity) { this(initialCapacity, 0.75F); } - + public HashMapDoubleDouble() { this(16, 0.75F); } - + public final boolean contains(double key) { int i = tableIndex(hashCodeDouble(key), this.capMinus1); - + for(HashMapDoubleDouble.Entry e = this.table[i]; e != null; e = e.next) { if(e.key == key) { return true; } } - + return false; } - + public boolean containsValue(double value) { for(int i = 0; i < this.table.length; ++i) { for(HashMapDoubleDouble.Entry e = this.table[i]; e != null; e = e.next) { @@ -73,37 +74,25 @@ public class HashMapDoubleDouble extends HashIntrinsic { } } } - + return false; } - + public double get(double key) { int i = tableIndex(hashCodeDouble(key), this.capMinus1); - + for(HashMapDoubleDouble.Entry e = this.table[i]; e != null; e = e.next) { if(key == e.key) { return e.value; } } - + return 4.9E-324D; } - - public HashMapDoubleDouble.Entry getEntry(double key) { - int i = tableIndex(hashCodeDouble(key), this.capMinus1); - - for(HashMapDoubleDouble.Entry e = this.table[i]; e != null; e = e.next) { - if(key == e.key) { - return e; - } - } - - return null; - } - + public double put(double key, double value) { int i = tableIndex(hashCodeDouble(key), this.capMinus1); - + for(HashMapDoubleDouble.Entry e = this.table[i]; e != null; e = e.next) { if(key == e.key) { double oldValue = e.value; @@ -111,20 +100,11 @@ public class HashMapDoubleDouble extends HashIntrinsic { return oldValue; } } - + this.addEntry(key, value, i); return 4.9E-324D; } - - private void addEntry(double key, double value, int index) { - HashMapDoubleDouble.Entry e = this.table[index]; - this.table[index] = new HashMapDoubleDouble.Entry(key, value, e); - if(this.size++ >= this.threshold) { - this.resize(2 * this.table.length); - } - - } - + public void resize(int newCapacity) { int oldCapacity = this.table.length; if(oldCapacity == 1073741824) { @@ -137,30 +117,11 @@ public class HashMapDoubleDouble extends HashIntrinsic { this.threshold = (int) ((float) newCapacity * this.loadFactor); } } - - private void transfer(HashMapDoubleDouble.Entry[] newTable) { - for(int j = 0; j < this.table.length; ++j) { - HashMapDoubleDouble.Entry e = this.table[j]; - if(e != null) { - this.table[j] = null; - - HashMapDoubleDouble.Entry next; - do { - next = e.next; - int i = tableIndex(hashCodeDouble(e.key), this.capMinus1); - e.next = newTable[i]; - newTable[i] = e; - e = next; - } while(next != null); - } - } - - } - + public final HashMapDoubleDouble.Entry remove(double key) { int i = tableIndex(hashCodeDouble(key), this.capMinus1); HashMapDoubleDouble.Entry prev = this.table[i]; - + HashMapDoubleDouble.Entry e; HashMapDoubleDouble.Entry next; for(e = prev; e != null; e = next) { @@ -172,112 +133,152 @@ public class HashMapDoubleDouble extends HashIntrinsic { } else { prev.next = next; } - + return e; } - + prev = e; } - + return e; } - + public void clear() { for(int i = 0; i < this.table.length; ++i) { this.table[i] = null; } - + this.size = 0; } - - private HashMapDoubleDouble.Entry[] createTable(int capacity) { - return new HashMapDoubleDouble.Entry[capacity]; - } - + public long memoryEstimate(int ptrsize) { return (long) ptrsize * (long) (this.capMinus1 + this.size + 1) + (long) (this.size * 64 / 4); } - + public HashMapDoubleDouble.Iterator iterator() { return new HashMapDoubleDouble.Iterator(); } - + + private void addEntry(double key, double value, int index) { + HashMapDoubleDouble.Entry e = this.table[index]; + this.table[index] = new HashMapDoubleDouble.Entry(key, value, e); + if(this.size++ >= this.threshold) { + this.resize(2 * this.table.length); + } + + } + + private void transfer(HashMapDoubleDouble.Entry[] newTable) { + for(int j = 0; j < this.table.length; ++j) { + HashMapDoubleDouble.Entry e = this.table[j]; + if(e != null) { + this.table[j] = null; + + HashMapDoubleDouble.Entry next; + do { + next = e.next; + int i = tableIndex(hashCodeDouble(e.key), this.capMinus1); + e.next = newTable[i]; + newTable[i] = e; + e = next; + } while(next != null); + } + } + + } + + private HashMapDoubleDouble.Entry[] createTable(int capacity) { + return new HashMapDoubleDouble.Entry[capacity]; + } + + public HashMapDoubleDouble.Entry getEntry(double key) { + int i = tableIndex(hashCodeDouble(key), this.capMinus1); + + for(HashMapDoubleDouble.Entry e = this.table[i]; e != null; e = e.next) { + if(key == e.key) { + return e; + } + } + + return null; + } + + public static class Entry implements Serializable { private static final long serialVersionUID = 7972173983741231238L; private final double key; private double value; private HashMapDoubleDouble.Entry next; - + public Entry(double key, double val, HashMapDoubleDouble.Entry n) { this.key = key; this.value = val; this.next = n; } - - public final double getKey() { - return this.key; - } - - public final double getValue() { - return this.value; - } - + public final double setValue(double newValue) { double oldValue = this.value; this.value = newValue; return oldValue; } - + + public final double getKey() { + return this.key; + } + + public final double getValue() { + return this.value; + } + + public final int hashCode() { + return hashCodeDouble(key) + hashCodeDouble(value); + } + public final boolean equals(Object o) { HashMapDoubleDouble.Entry e = (HashMapDoubleDouble.Entry) o; return this.key == e.key && this.value == e.value; } - + public final String toString() { return this.key + " = " + this.value; } - - public final int hashCode() { - return hashCodeDouble(key) + hashCodeDouble(value); - } } - + + public class Iterator { HashMapDoubleDouble.Entry next; int index; HashMapDoubleDouble.Entry current; - + Iterator() { if(HashMapDoubleDouble.this.size > 0) { - while(this.index < HashMapDoubleDouble.this.table.length && (this.next = HashMapDoubleDouble.this.table[this.index++]) == null) { + while(this.index < HashMapDoubleDouble.this.table.length && + (this.next = HashMapDoubleDouble.this.table[this.index++]) == null) { } } - + } - - public final boolean hasNext() { - return this.next != null; - } - + public HashMapDoubleDouble.Entry nextEntry() { HashMapDoubleDouble.Entry e = this.next; if(e == null) { throw new NoSuchElementException(); } else { if((this.next = e.next) == null) { - while(this.index < HashMapDoubleDouble.this.table.length && (this.next = HashMapDoubleDouble.this.table[this.index++]) == null) { + while(this.index < HashMapDoubleDouble.this.table.length && + (this.next = HashMapDoubleDouble.this.table[this.index++]) == null) { } } - + this.current = e; return e; } } - + public double next() { return this.nextEntry().value; } - + public void remove() { if(this.current == null) { throw new IllegalStateException(); @@ -287,5 +288,9 @@ public class HashMapDoubleDouble extends HashIntrinsic { HashMapDoubleDouble.this.remove(k); } } + + public final boolean hasNext() { + return this.next != null; + } } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java index 692506afa..47d55dc34 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java @@ -17,16 +17,16 @@ import com.dfsek.terra.api.world.generator.GenerationStageProvider; public class OreAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - event.getPack().registerConfigType(new OreConfigType(), "ORE", 1); - event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("ORE", pack -> new OrePopulator(main)); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + event.getPack().registerConfigType(new OreConfigType(), "ORE", 1); + event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("ORE", pack -> new OrePopulator(main)); + }) + .failThrough(); } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java index 36ffa5785..52897d14c 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.ore; +import java.util.function.Supplier; + import com.dfsek.terra.addons.ore.ores.Ore; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; @@ -8,29 +10,29 @@ import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.function.Supplier; public class OreConfigType implements ConfigType { + public static final TypeKey ORE_TYPE_TOKEN = new TypeKey<>() { + }; private final OreFactory factory = new OreFactory(); - public static final TypeKey ORE_TYPE_TOKEN = new TypeKey<>(){}; - - @Override - public OreTemplate getTemplate(ConfigPack pack, TerraPlugin main) { - return new OreTemplate(); - } - - @Override - public ConfigFactory getFactory() { - return factory; - } - - @Override - public TypeKey getTypeKey() { - return ORE_TYPE_TOKEN; - } - + @Override public Supplier> registrySupplier(ConfigPack pack) { return pack.getRegistryFactory()::create; } + + @Override + public OreTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new OreTemplate(); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeKey() { + return ORE_TYPE_TOKEN; + } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java index 010ffa867..ae83e74d0 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreFactory.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigFactory; + public class OreFactory implements ConfigFactory { @Override public Ore build(OreTemplate config, TerraPlugin main) { diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java index f6146fdd0..8d1900765 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.ore; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.profiler.ProfileFrame; import com.dfsek.terra.api.util.PopulationUtil; @@ -7,23 +11,21 @@ import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.GenerationStage; -import org.jetbrains.annotations.NotNull; -import java.util.Random; public class OrePopulator implements GenerationStage { private final TerraPlugin main; - + public OrePopulator(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { try(ProfileFrame ignore = main.getProfiler().profile("ore")) { if(world.getConfig().disableOres()) return; - + for(int cx = -1; cx <= 1; cx++) { for(int cz = -1; cz <= 1; cz++) { Random random = new Random(PopulationUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); @@ -38,7 +40,8 @@ public class OrePopulator implements GenerationStage { try(ProfileFrame ignored = main.getProfiler().profile("ore:" + id)) { int amount = orePair.getRight().getAmount().get(random); for(int i = 0; i < amount; i++) { - Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, orePair.getRight().getHeight().get(random), random.nextInt(16) + 16 * finalCz); + Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, orePair.getRight().getHeight().get + (random), random.nextInt(16) + 16 * finalCz); orePair.getLeft().generate(location, chunk, random); } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java index 764ddc19e..fbbfa14d9 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java @@ -3,6 +3,10 @@ package com.dfsek.terra.addons.ore; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; + +import java.util.HashMap; +import java.util.Map; + import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.AbstractableTemplate; @@ -10,68 +14,66 @@ import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; -import java.util.HashMap; -import java.util.Map; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) public class OreTemplate implements AbstractableTemplate { @Value("id") @Final private String id; - + @Value("material") private @Meta BlockState material; - + @Value("material-overrides") @Default private @Meta Map<@Meta BlockType, @Meta BlockState> materials = new HashMap<>(); - + @Value("replace") private @Meta MaterialSet replaceable; - + @Value("physics") @Default private @Meta boolean physics = false; - + @Value("size") private @Meta Range size; - + @Value("deform") @Default private @Meta double deform = 0.75D; - + @Value("deform-frequency") @Default private @Meta double deformFrequency = 0.1D; - - public double getDeform() { - return deform; - } - - public double getDeformFrequency() { - return deformFrequency; - } - - public Range getSize() { - return size; - } - - public BlockState getMaterial() { - return material; - } - - public MaterialSet getReplaceable() { - return replaceable; - } - + public boolean doPhysics() { return physics; } - + + public double getDeform() { + return deform; + } + + public double getDeformFrequency() { + return deformFrequency; + } + + public Range getSize() { + return size; + } + + public BlockState getMaterial() { + return material; + } + + public MaterialSet getReplaceable() { + return replaceable; + } + public String getID() { return id; } - + public Map getMaterialOverrides() { return materials; } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/Ore.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/Ore.java index b6583b752..60f83afb0 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/Ore.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/Ore.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.ore.ores; +import java.util.Map; +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; @@ -7,17 +10,15 @@ import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; -import java.util.Map; -import java.util.Random; public abstract class Ore { - + private final BlockState material; private final MaterialSet replaceable; private final boolean applyGravity; private final Map materials; protected TerraPlugin main; - + public Ore(BlockState material, MaterialSet replaceable, boolean applyGravity, TerraPlugin main, Map materials) { this.material = material; this.replaceable = replaceable; @@ -25,17 +26,17 @@ public abstract class Ore { this.main = main; this.materials = materials; } - + public abstract void generate(Vector3 origin, Chunk c, Random r); - + public BlockState getMaterial(BlockType replace) { return materials.getOrDefault(replace, material); } - + public MaterialSet getReplaceable() { return replaceable; } - + public boolean isApplyGravity() { return applyGravity; } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreConfig.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreConfig.java index 4238c3d5d..2f23ddadb 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreConfig.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreConfig.java @@ -2,19 +2,20 @@ package com.dfsek.terra.addons.ore.ores; import com.dfsek.terra.api.util.Range; + public class OreConfig { private final Range amount; private final Range height; - + public OreConfig(Range amount, Range height) { this.amount = amount; this.height = height; } - + public Range getAmount() { return amount; } - + public Range getHeight() { return height; } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreHolder.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreHolder.java index 1509e1df3..18344605c 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreHolder.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/OreHolder.java @@ -1,45 +1,46 @@ package com.dfsek.terra.addons.ore.ores; -import com.dfsek.terra.api.util.generic.pair.ImmutablePair; - import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; +import com.dfsek.terra.api.util.generic.pair.ImmutablePair; + + /** * Holds ordered list of ores mapped to their configs. */ public class OreHolder { private final List entries = new ArrayList<>(); - + public void forEach(BiConsumer> consumer) { entries.forEach(entry -> consumer.accept(entry.getId(), ImmutablePair.of(entry.getOre(), entry.getConfig()))); } - + public OreHolder add(Ore ore, OreConfig config, String id) { entries.add(new Entry(ore, config, id)); return this; } - + private static final class Entry { private final Ore ore; private final OreConfig config; private final String id; - + private Entry(Ore ore, OreConfig config, String id) { this.ore = ore; this.config = config; this.id = id; } - + public OreConfig getConfig() { return config; } - + public Ore getOre() { return ore; } - + public String getId() { return id; } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java index 030bf4858..bdaba124e 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java @@ -1,5 +1,10 @@ package com.dfsek.terra.addons.ore.ores; +import net.jafama.FastMath; + +import java.util.Map; +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; @@ -7,59 +12,56 @@ import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; -import net.jafama.FastMath; - -import java.util.Map; -import java.util.Random; public class VanillaOre extends Ore { private final Range sizeRange; - - public VanillaOre(BlockState material, MaterialSet replaceable, boolean applyGravity, Range size, TerraPlugin main, Map materials) { + + public VanillaOre(BlockState material, MaterialSet replaceable, boolean applyGravity, Range size, TerraPlugin main, + Map materials) { super(material, replaceable, applyGravity, main, materials); this.sizeRange = size; } - + @Override public void generate(Vector3 location, Chunk chunk, Random random) { double size = sizeRange.get(random); - + int centerX = location.getBlockX(); int centerZ = location.getBlockZ(); int centerY = location.getBlockY(); - - + + double f = random.nextFloat() * Math.PI; - + double fS = FastMath.sin(f) * size / 8.0F; double fC = FastMath.cos(f) * size / 8.0F; - + double d1 = centerX + 8 + fS; double d2 = centerX + 8 - fS; double d3 = centerZ + 8 + fC; double d4 = centerZ + 8 - fC; - + double d5 = centerY + random.nextInt(3) - 2D; double d6 = centerY + random.nextInt(3) - 2D; - + for(int i = 0; i < size; i++) { double iFactor = i / size; - + double d10 = random.nextDouble() * size / 16.0D; double d11 = (FastMath.sin(Math.PI * iFactor) + 1.0) * d10 + 1.0; - + int xStart = FastMath.roundToInt(FastMath.floor(d1 + (d2 - d1) * iFactor - d11 / 2.0D)); int yStart = FastMath.roundToInt(FastMath.floor(d5 + (d6 - d5) * iFactor - d11 / 2.0D)); int zStart = FastMath.roundToInt(FastMath.floor(d3 + (d4 - d3) * iFactor - d11 / 2.0D)); - + int xEnd = FastMath.roundToInt(FastMath.floor(d1 + (d2 - d1) * iFactor + d11 / 2.0D)); int yEnd = FastMath.roundToInt(FastMath.floor(d5 + (d6 - d5) * iFactor + d11 / 2.0D)); int zEnd = FastMath.roundToInt(FastMath.floor(d3 + (d4 - d3) * iFactor + d11 / 2.0D)); - + for(int x = xStart; x <= xEnd; x++) { double d13 = (x + 0.5D - (d1 + (d2 - d1) * iFactor)) / (d11 / 2.0D); - + if(d13 * d13 < 1.0D) { for(int y = yStart; y <= yEnd; y++) { double d14 = (y + 0.5D - (d5 + (d6 - d5) * iFactor)) / (d11 / 2.0D); @@ -67,7 +69,7 @@ public class VanillaOre extends Ore { for(int z = zStart; z <= zEnd; z++) { double d15 = (z + 0.5D - (d3 + (d4 - d3) * iFactor)) / (d11 / 2.0D); if(x > 15 || z > 15 || y > 255 || x < 0 || z < 0 || y < 0) continue; - + BlockType type = chunk.getBlock(x, y, z).getBlockType(); if((d13 * d13 + d14 * d14 + d15 * d15 < 1.0D) && getReplaceable().contains(type)) { chunk.setBlock(x, y, z, getMaterial(type), isApplyGravity()); diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java index 66ae41d57..acfcb5df9 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java @@ -11,22 +11,23 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.injection.annotations.Inject; + @Addon("config-palette") @Author("Terra") @Version("1.0.0") public class PaletteAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - event.getPack().registerConfigType(new PaletteConfigType(main), "PALETTE", 2); - event.getPack().applyLoader(PaletteLayerHolder.class, new PaletteLayerLoader()); - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + event.getPack().registerConfigType(new PaletteConfigType(main), "PALETTE", 2); + event.getPack().applyLoader(PaletteLayerHolder.class, new PaletteLayerLoader()); + }) + .failThrough(); } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java index 97d4c81fa..59dc7a9c5 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java @@ -2,6 +2,9 @@ package com.dfsek.terra.addons.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.TypeLoader; + +import java.util.function.Supplier; + import com.dfsek.terra.addons.palette.palette.PaletteImpl; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; @@ -11,42 +14,42 @@ import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.generator.Palette; -import java.util.function.Supplier; public class PaletteConfigType implements ConfigType { + public static final TypeKey PALETTE_TYPE_TOKEN = new TypeKey<>() { + }; private final PaletteFactory factory = new PaletteFactory(); private final TerraPlugin main; - - public static final TypeKey PALETTE_TYPE_TOKEN = new TypeKey<>(){}; - + public PaletteConfigType(TerraPlugin main) { this.main = main; } - - @Override - public PaletteTemplate getTemplate(ConfigPack pack, TerraPlugin main) { - return new PaletteTemplate(); - } - - @Override - public ConfigFactory getFactory() { - return factory; - } - - @Override - public TypeKey getTypeKey() { - return PALETTE_TYPE_TOKEN; - } - + @Override public Supplier> registrySupplier(ConfigPack pack) { return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(((String) c).startsWith("BLOCK:")) - return new PaletteImpl.Singleton(main.getWorldHandle().createBlockData(((String) c).substring(6))); // Return single palette for BLOCK: shortcut. + return new PaletteImpl.Singleton( + main.getWorldHandle().createBlockData(((String) c).substring(6))); // Return single palette for BLOCK: shortcut. Palette obj = registry.get((String) c); if(obj == null) throw new LoadException("No such " + t.getType().getTypeName() + " matching \"" + c + "\" was found in this registry."); return obj; }); } + + @Override + public PaletteTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new PaletteTemplate(); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeKey() { + return PALETTE_TYPE_TOKEN; + } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java index f64eb7931..694246491 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.world.generator.Palette; + public class PaletteFactory implements ConfigFactory { @Override public Palette build(PaletteTemplate config, TerraPlugin main) { diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java index 6b0f778a8..8224f2de5 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java @@ -3,34 +3,36 @@ package com.dfsek.terra.addons.palette; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; + +import java.util.List; + import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; -import java.util.List; -@SuppressWarnings({"FieldMayBeFinal", "unused"}) +@SuppressWarnings({ "FieldMayBeFinal", "unused" }) public class PaletteTemplate implements AbstractableTemplate { @Value("noise") @Default private @Meta NoiseSampler noise = NoiseSampler.zero(); - + @Value("id") @Final private String id; - + @Value("layers") private @Meta List<@Meta PaletteLayerHolder> palette; - + public String getID() { return id; } - + public List getPalette() { return palette; } - + public NoiseSampler getNoise() { return noise; } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java index 24e1bac68..7f630a4b2 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java @@ -1,17 +1,18 @@ package com.dfsek.terra.addons.palette.palette; +import java.util.List; + import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.noise.NoiseSampler; -import java.util.List; public class NoisePalette extends PaletteImpl { private final NoiseSampler sampler; - + public NoisePalette(NoiseSampler sampler) { this.sampler = sampler; - } - + } + @Override public BlockState get(int layer, double x, double y, double z, long seed) { PaletteLayer paletteLayer; diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java index e11462958..1201b852e 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java @@ -1,13 +1,13 @@ package com.dfsek.terra.addons.palette.palette; +import java.util.ArrayList; +import java.util.List; + import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.generator.Palette; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; /** * A class representation of a "slice" of the world. @@ -15,14 +15,14 @@ import java.util.Random; */ public abstract class PaletteImpl implements Palette { private final List pallet = new ArrayList<>(); - + /** * Constructs a blank palette. */ public PaletteImpl() { - + } - + @Override public Palette add(BlockState m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { @@ -30,7 +30,7 @@ public abstract class PaletteImpl implements Palette { } return this; } - + @Override public Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { @@ -38,17 +38,17 @@ public abstract class PaletteImpl implements Palette { } return this; } - - + + @Override public int getSize() { return pallet.size(); } - + public List getLayers() { return pallet; } - + /** * Class representation of a layer of a BlockPalette. */ @@ -57,7 +57,7 @@ public abstract class PaletteImpl implements Palette { private final NoiseSampler sampler; private ProbabilityCollection collection; private BlockState m; - + /** * Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers. * @@ -69,7 +69,7 @@ public abstract class PaletteImpl implements Palette { this.col = true; this.collection = type; } - + /** * Constructs a PaletteLayerHolder with a single Material and a number of layers. * @@ -81,29 +81,29 @@ public abstract class PaletteImpl implements Palette { this.col = false; this.m = type; } - - public NoiseSampler getSampler() { - return sampler; - } - - + public BlockState get(NoiseSampler random, double x, double y, double z, long seed) { if(col) return this.collection.get(random, x, y, z, seed); return m; } - + + public NoiseSampler getSampler() { + return sampler; + } + public ProbabilityCollection getCollection() { return collection; } } - + + public static class Singleton extends PaletteImpl { private final BlockState item; - + public Singleton(BlockState item) { this.item = item; } - + @Override public BlockState get(int layer, double x, double y, double z, long seed) { return item; diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java index 6808e5723..484872036 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerHolder.java @@ -1,30 +1,32 @@ package com.dfsek.terra.addons.palette.palette; +import org.jetbrains.annotations.NotNull; + import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -import org.jetbrains.annotations.NotNull; + public class PaletteLayerHolder { private final ProbabilityCollection layer; private final NoiseSampler sampler; private final int size; - + public PaletteLayerHolder(@NotNull ProbabilityCollection layer, NoiseSampler sampler, int size) { this.layer = layer; this.sampler = sampler; this.size = size; } - + @NotNull public ProbabilityCollection getLayer() { return layer; } - + public int getSize() { return size; } - + public NoiseSampler getSampler() { return sampler; } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java index a5c73728f..0f5104930 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteLayerLoader.java @@ -3,38 +3,40 @@ package com.dfsek.terra.addons.palette.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; import java.lang.reflect.AnnotatedType; import java.util.Map; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; + + @SuppressWarnings("unchecked") public class PaletteLayerLoader implements TypeLoader { private static final AnnotatedType BLOCK_DATA_PROBABILITY_COLLECTION_TYPE; - static { try { - BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = PaletteLayerLoader.class.getDeclaredField("blockStateProbabilityCollection").getAnnotatedType(); + BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = PaletteLayerLoader.class.getDeclaredField("blockStateProbabilityCollection") + .getAnnotatedType(); } catch(NoSuchFieldException e) { throw new Error("this should never happen. i dont know what you did to make this happen but something is very wrong.", e); } } - @SuppressWarnings("unused") private ProbabilityCollection blockStateProbabilityCollection; - + @Override public PaletteLayerHolder load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException { Map map = (Map) o; - ProbabilityCollection collection = (ProbabilityCollection) configLoader.loadType(BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials")); - + ProbabilityCollection collection = (ProbabilityCollection) configLoader.loadType( + BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials")); + NoiseSampler sampler = null; if(map.containsKey("noise")) { sampler = configLoader.loadType(NoiseSampler.class, map.get("noise")); } - + if(collection == null) throw new LoadException("Collection is null: " + map.get("materials")); return new PaletteLayerHolder(collection, sampler, (Integer) map.get("layers")); } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java index 2c5e20d2e..69c7ae792 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructures.java @@ -1,17 +1,18 @@ package com.dfsek.terra.addons.structure; +import java.util.Set; + import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; -import java.util.Set; public class BiomeStructures implements Properties { private final Set structures; - + public BiomeStructures(Set structures) { this.structures = structures; } - + public Set getStructures() { return structures; } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java index c2a68b691..efc6afc0f 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/BiomeStructuresTemplate.java @@ -3,17 +3,19 @@ package com.dfsek.terra.addons.structure; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import java.util.Collections; import java.util.Set; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; + + public class BiomeStructuresTemplate implements ObjectTemplate { @Value("structures") @Default - private @Meta Set<@Meta ConfiguredStructure> structures = Collections.emptySet(); - + private final @Meta Set<@Meta ConfiguredStructure> structures = Collections.emptySet(); + @Override public BiomeStructures get() { return new BiomeStructures(structures); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java index 6673aaa92..90e4ff4de 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureAddon.java @@ -10,19 +10,20 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; + @Addon("config-structure") @Version("1.0.0") @Author("Terra") public class StructureAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack().applyLoader(ConfiguredStructure.class, (t, o, l) -> null)) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack().applyLoader(ConfiguredStructure.class, (t, o, l) -> null)) + .failThrough(); } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java index b614514b0..314bc0cb9 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureFactory.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; + public class StructureFactory implements ConfigFactory { @Override public ConfiguredStructure build(StructureTemplate config, TerraPlugin main) { diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java index e3067f95a..20a4a8e1d 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java @@ -1,5 +1,10 @@ package com.dfsek.terra.addons.structure; +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.config.WorldConfig; import com.dfsek.terra.api.profiler.ProfileFrame; @@ -12,36 +17,35 @@ import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.Chunkified; import com.dfsek.terra.api.world.generator.GenerationStage; -import net.jafama.FastMath; -import org.jetbrains.annotations.NotNull; -import java.util.Random; public class StructurePopulator implements GenerationStage, Chunkified { private final TerraPlugin main; - + public StructurePopulator(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { try(ProfileFrame ignore = main.getProfiler().profile("structure")) { if(world.getConfig().disableStructures()) return; - + int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); BiomeProvider provider = world.getBiomeProvider(); WorldConfig config = world.getConfig(); for(ConfiguredStructure conf : config.getRegistry(TerraStructure.class).entries()) { Vector3 spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()); - + if(!provider.getBiome(spawn, world.getSeed()).getContext().get(BiomeStructures.class).getStructures().contains(conf)) { continue; } - Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); - conf.getStructure().get(random).generate(spawn.setY(conf.getSpawnStart().get(random)), world, chunk, random, Rotation.fromDegrees(90 * random.nextInt(4))); + Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), + FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); + conf.getStructure().get(random).generate(spawn.setY(conf.getSpawnStart().get(random)), world, chunk, random, + Rotation.fromDegrees(90 * random.nextInt(4))); } } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java index 7bfaf029e..b9e86647c 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructureTemplate.java @@ -2,7 +2,7 @@ package com.dfsek.terra.addons.structure; import com.dfsek.tectonic.annotations.Final; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; + import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.structure.Structure; @@ -10,33 +10,34 @@ import com.dfsek.terra.api.structure.StructureSpawn; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; -@SuppressWarnings({"unused", "FieldMayBeFinal"}) -public class StructureTemplate implements AbstractableTemplate, ConfigTemplate { + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) +public class StructureTemplate implements AbstractableTemplate { @Value("id") @Final private String id; - + @Value("scripts") private @Meta ProbabilityCollection<@Meta Structure> structure; - + @Value("spawn.start") private @Meta Range y; - + @Value("spawn") private @Meta StructureSpawn spawn; - + public String getID() { return id; } - + public ProbabilityCollection getStructures() { return structure; } - + public Range getY() { return y; } - + public StructureSpawn getSpawn() { return spawn; } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java index 79b37e7fa..283a45268 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/TerraStructure.java @@ -1,37 +1,38 @@ package com.dfsek.terra.addons.structure; -import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.StructureSpawn; +import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; + public class TerraStructure implements ConfiguredStructure { private final ProbabilityCollection structure; private final Range spawnStart; private final StructureSpawn spawn; - + public TerraStructure(ProbabilityCollection structures, Range spawnStart, StructureSpawn spawn) { this.structure = structures; this.spawnStart = spawnStart; this.spawn = spawn; } - + @Override public ProbabilityCollection getStructure() { return structure; } - + @Override public Range getSpawnStart() { return spawnStart; } - + @Override public StructureSpawn getSpawn() { return spawn; } - + @Override public String getID() { return null; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java index 9154f0599..c3109c635 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/AsyncStructureFinder.java @@ -1,13 +1,15 @@ package com.dfsek.terra.addons.structure.command; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import org.jetbrains.annotations.NotNull; -import java.util.function.Consumer; public class AsyncStructureFinder implements Runnable { protected final BiomeProvider provider; @@ -20,8 +22,9 @@ public class AsyncStructureFinder implements Runnable { protected final TerraPlugin main; private final Consumer callback; protected int searchSize = 1; - - public AsyncStructureFinder(BiomeProvider provider, ConfiguredStructure target, @NotNull Vector3 origin, World world, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { + + public AsyncStructureFinder(BiomeProvider provider, ConfiguredStructure target, @NotNull Vector3 origin, World world, int startRadius, + int maxRadius, Consumer callback, TerraPlugin main) { //setSearchSize(target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation()); this.provider = provider; this.target = target; @@ -33,31 +36,23 @@ public class AsyncStructureFinder implements Runnable { this.world = world; this.callback = callback; } - + public Vector3 finalizeVector(Vector3 orig) { return orig;//target.getSpawn().getChunkSpawn(orig.getBlockX(), orig.getBlockZ(), world.getSeed()); } - - public boolean isValid(int x, int z, ConfiguredStructure target) { - //Vector3 spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()); - //if(!((UserDefinedBiome) provider.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; - //Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); - //return target.getStructure().get(random).test(spawn.setY(target.getSpawnStart().get(random)), world, random, Rotation.fromDegrees(90 * random.nextInt(4))); - return false; - } - + @Override public void run() { int x = centerX; int z = centerZ; - + x /= searchSize; z /= searchSize; - + int run = 1; boolean toggle = true; boolean found = false; - + main: for(int i = startRadius; i < maxRadius; i++) { for(int j = 0; j < run; j++) { @@ -82,23 +77,33 @@ public class AsyncStructureFinder implements Runnable { Vector3 finalSpawn = found ? finalizeVector(new Vector3(x, 0, z)) : null; callback.accept(finalSpawn); } - + + public boolean isValid(int x, int z, ConfiguredStructure target) { + //Vector3 spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()); + //if(!((UserDefinedBiome) provider.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; + //Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn + // .getBlockZ(), 16), world.getSeed())); + //return target.getStructure().get(random).test(spawn.setY(target.getSpawnStart().get(random)), world, random, Rotation + // .fromDegrees(90 * random.nextInt(4))); + return false; + } + public ConfiguredStructure getTarget() { return target; } - + public World getWorld() { return world; } - + public BiomeProvider getProvider() { return provider; } - + public int getSearchSize() { return searchSize; } - + public void setSearchSize(int searchSize) { this.searchSize = searchSize; } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureCommand.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureCommand.java index 8565e4f8d..9b5665688 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureCommand.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureCommand.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.command.annotation.Command; import com.dfsek.terra.api.command.annotation.Subcommand; import com.dfsek.terra.api.entity.CommandSender; + @Command( subcommands = { @Subcommand( diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureExportCommand.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureExportCommand.java index 7ea9e0969..a1f7f89c1 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureExportCommand.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureExportCommand.java @@ -1,5 +1,10 @@ package com.dfsek.terra.addons.structure.command.structure; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.Sign; @@ -17,44 +22,33 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.vector.Vector3; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; @PlayerCommand @WorldCommand @DebugCommand -@Command( - arguments = { - @Argument( - value = "id" - ) - }, - usage = "/terra structure export " -) +@Command(arguments = @Argument("id"), usage = "/terra structure export ") public class StructureExportCommand implements CommandTemplate { @Inject private TerraPlugin main; - + @ArgumentTarget("id") private String id; - + @Override public void execute(CommandSender sender) { Player player = (Player) sender; - + Pair l = main.getWorldHandle().getSelectedLocation(player); - + Vector3 l1 = l.getLeft(); Vector3 l2 = l.getRight(); - + StringBuilder scriptBuilder = new StringBuilder("id \"" + id + "\";\nnum y = 0;\n"); - + int centerX = 0; int centerY = 0; int centerZ = 0; - + for(int x = l1.getBlockX(); x <= l2.getBlockX(); x++) { for(int y = l1.getBlockY(); y <= l2.getBlockY(); y++) { for(int z = l1.getBlockZ(); z <= l2.getBlockZ(); z++) { @@ -70,11 +64,11 @@ public class StructureExportCommand implements CommandTemplate { } } } - + for(int x = l1.getBlockX(); x <= l2.getBlockX(); x++) { for(int y = l1.getBlockY(); y <= l2.getBlockY(); y++) { for(int z = l1.getBlockZ(); z <= l2.getBlockZ(); z++) { - + BlockState data = player.world().getBlockData(x, y, z); if(data.isStructureVoid()) continue; BlockEntity state = player.world().getBlockState(x, y, z); @@ -85,14 +79,15 @@ public class StructureExportCommand implements CommandTemplate { } } if(!data.isStructureVoid()) { - scriptBuilder.append("block(").append(x - l1.getBlockX() - centerX).append(", y + ").append(y - l1.getBlockY() - centerY).append(", ").append(z - l1.getBlockZ() - centerZ).append(", ") - .append("\""); + scriptBuilder.append("block(").append(x - l1.getBlockX() - centerX).append(", y + ").append( + y - l1.getBlockY() - centerY).append(", ").append(z - l1.getBlockZ() - centerZ).append(", ") + .append("\""); scriptBuilder.append(data.getAsString()).append("\");\n"); } } } } - + File file = new File(main.getDataFolder() + File.separator + "export" + File.separator + "structures", id + ".tesf"); try { file.getParentFile().mkdirs(); @@ -105,7 +100,7 @@ public class StructureExportCommand implements CommandTemplate { } catch(IOException e) { e.printStackTrace(); } - + sender.sendMessage("Exported structure to " + file.getAbsolutePath()); } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLoadCommand.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLoadCommand.java index 7d10eac31..7122119a1 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLoadCommand.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLoadCommand.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.structure.command.structure; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + import com.dfsek.terra.addons.structure.command.structure.argument.ScriptArgumentParser; import com.dfsek.terra.addons.structure.command.structure.completer.RotationCompleter; import com.dfsek.terra.addons.structure.command.structure.completer.ScriptCompleter; @@ -20,51 +23,43 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.rotation.Rotation; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; @PlayerCommand @DebugCommand @WorldCommand -@Command( - arguments = { - @Argument( - value = "structure", - tabCompleter = ScriptCompleter.class, - argumentParser = ScriptArgumentParser.class - ), - @Argument( - value = "rotation", - required = false, - tabCompleter = RotationCompleter.class, - argumentParser = IntegerArgumentParser.class, - defaultValue = "0" - ) - }, - switches = { - @Switch(value = "chunk", - aliases = "c" - ) - }, - usage = "/terra structure load [ROTATION] [-c]" -) +@Command(arguments = { + @Argument( + value = "structure", + tabCompleter = ScriptCompleter.class, + argumentParser = ScriptArgumentParser.class + ), + @Argument( + value = "rotation", + required = false, + tabCompleter = RotationCompleter.class, + argumentParser = IntegerArgumentParser.class, + defaultValue = "0" + ) +}, switches = @Switch(value = "chunk", + aliases = "c" +), usage = "/terra structure load [ROTATION] [-c]") public class StructureLoadCommand implements CommandTemplate { @ArgumentTarget("rotation") - private Integer rotation = 0; - + private final Integer rotation = 0; + @SwitchTarget("chunk") private boolean chunk; - + @ArgumentTarget("structure") private Structure script; - + @Inject private TerraPlugin main; - + @Override public void execute(CommandSender sender) { Player player = (Player) sender; - + long t = System.nanoTime(); Random random = new Random(ThreadLocalRandom.current().nextLong()); Rotation r; @@ -84,7 +79,7 @@ public class StructureLoadCommand implements CommandTemplate { script.generate(player.position(), player.world(), random, r); } long l = System.nanoTime() - t; - + sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java index 0e115f7a6..f07fd2143 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/StructureLocateCommand.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.structure.command.structure; +import java.util.Locale; + import com.dfsek.terra.addons.structure.command.AsyncStructureFinder; import com.dfsek.terra.addons.structure.command.structure.argument.StructureArgumentParser; import com.dfsek.terra.addons.structure.command.structure.completer.StructureCompleter; @@ -19,53 +21,53 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; import com.dfsek.terra.api.vector.Vector3; -import java.util.Locale; @PlayerCommand @WorldCommand -@Command( - arguments = { - @Argument( - value = "structure", - tabCompleter = StructureCompleter.class, - argumentParser = StructureArgumentParser.class - ), - @Argument( - value = "radius", - required = false, - defaultValue = "100", - argumentParser = IntegerArgumentParser.class - ) - }, - switches = { - @Switch( - value = "teleport", - aliases = {"t", "tp"} - ) - } -) +@Command(arguments = { + @Argument( + value = "structure", + tabCompleter = StructureCompleter.class, + argumentParser = StructureArgumentParser.class + ), + @Argument( + value = "radius", + required = false, + defaultValue = "100", + argumentParser = IntegerArgumentParser.class + ) +}, switches = @Switch( + value = "teleport", + aliases = { "t", "tp" } +)) public class StructureLocateCommand implements CommandTemplate { @Inject private TerraPlugin main; - + @ArgumentTarget("structure") private ConfiguredStructure structure; - + @ArgumentTarget("radius") private Integer radius; - + @SwitchTarget("teleport") private boolean teleport; - + @Override public void execute(CommandSender sender) { Player player = (Player) sender; - - new Thread(new AsyncStructureFinder(player.world().getBiomeProvider(), structure, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> { + + new Thread(new AsyncStructureFinder(player.world().getBiomeProvider(), structure, + player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), + player.world(), 0, radius, location -> { if(location != null) { - sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", structure.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position()))); + sender.sendMessage( + String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", structure.getID().toLowerCase(Locale.ROOT), + location.getBlockX(), location.getBlockZ(), + location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position()))); if(teleport) { - main.runPossiblyUnsafeTask(() -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ()))); + main.runPossiblyUnsafeTask( + () -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ()))); } } //else LangUtil.send("command.biome.unable-to-locate", sender); }, main), "Biome Location Thread").start(); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java index 3c1b982e0..94f2366c9 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/ScriptArgumentParser.java @@ -7,10 +7,11 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.Structure; + public class ScriptArgumentParser implements ArgumentParser { @Inject private TerraPlugin main; - + @Override public Structure parse(CommandSender sender, String arg) { return ((Player) sender).world().getConfig().getRegistry(Structure.class).get(arg); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java index 515dade11..030fcc718 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/argument/StructureArgumentParser.java @@ -7,10 +7,11 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; + public class StructureArgumentParser implements ArgumentParser { @Inject private TerraPlugin main; - + @Override public ConfiguredStructure parse(CommandSender sender, String arg) { return ((Player) sender).world().getConfig().getRegistry(ConfiguredStructure.class).get(arg); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/RotationCompleter.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/RotationCompleter.java index 92ce61184..01d5ed287 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/RotationCompleter.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/RotationCompleter.java @@ -1,10 +1,11 @@ package com.dfsek.terra.addons.structure.command.structure.completer; +import java.util.Arrays; +import java.util.List; + import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.entity.CommandSender; -import java.util.Arrays; -import java.util.List; public class RotationCompleter implements TabCompleter { @Override diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/ScriptCompleter.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/ScriptCompleter.java index d516312e7..0152d409b 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/ScriptCompleter.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/ScriptCompleter.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.structure.command.structure.completer; +import java.util.List; +import java.util.stream.Collectors; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.entity.CommandSender; @@ -7,15 +10,14 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.Structure; -import java.util.List; -import java.util.stream.Collectors; public class ScriptCompleter implements TabCompleter { @Inject private TerraPlugin main; - + @Override public List complete(CommandSender sender) { - return ((Player) sender).world().getConfig().getRegistry(Structure.class).entries().stream().map(Structure::getID).collect(Collectors.toList()); + return ((Player) sender).world().getConfig().getRegistry(Structure.class).entries().stream().map(Structure::getID).collect( + Collectors.toList()); } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java index f51538600..4daaa8d88 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/command/structure/completer/StructureCompleter.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.structure.command.structure.completer; +import java.util.ArrayList; +import java.util.List; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.tab.TabCompleter; import com.dfsek.terra.api.entity.CommandSender; @@ -7,13 +10,11 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.structure.configured.ConfiguredStructure; -import java.util.ArrayList; -import java.util.List; public class StructureCompleter implements TabCompleter { @Inject private TerraPlugin main; - + @Override public List complete(CommandSender sender) { Player player = (Player) sender; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java index 42eecd8a0..4c207a0cf 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java @@ -1,12 +1,5 @@ package com.dfsek.terra.addons.structure.structures.loot; -import com.dfsek.terra.addons.structure.structures.loot.functions.AmountFunction; -import com.dfsek.terra.addons.structure.structures.loot.functions.DamageFunction; -import com.dfsek.terra.addons.structure.structures.loot.functions.EnchantFunction; -import com.dfsek.terra.addons.structure.structures.loot.functions.LootFunction; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.inventory.Item; -import com.dfsek.terra.api.inventory.ItemStack; import net.jafama.FastMath; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -15,6 +8,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.dfsek.terra.addons.structure.structures.loot.functions.AmountFunction; +import com.dfsek.terra.addons.structure.structures.loot.functions.DamageFunction; +import com.dfsek.terra.addons.structure.structures.loot.functions.EnchantFunction; +import com.dfsek.terra.addons.structure.structures.loot.functions.LootFunction; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.inventory.Item; +import com.dfsek.terra.api.inventory.ItemStack; + + /** * Representation of a single item entry within a Loot Table pool. */ @@ -22,7 +24,7 @@ public class Entry { private final Item item; private final long weight; private final List functions = new ArrayList<>(); - + /** * Instantiates an Entry from a JSON representation. * @@ -31,14 +33,14 @@ public class Entry { public Entry(JSONObject entry, TerraPlugin main) { String id = entry.get("name").toString(); this.item = main.getItemHandle().createItem(id); - + long weight1; try { weight1 = (long) entry.get("weight"); } catch(NullPointerException e) { weight1 = 1; } - + this.weight = weight1; if(entry.containsKey("functions")) { for(Object function : (JSONArray) entry.get("functions")) { @@ -69,17 +71,19 @@ public class Entry { JSONArray disabled = null; if(((JSONObject) function).containsKey("disabled_enchants")) disabled = (JSONArray) ((JSONObject) function).get("disabled_enchants"); - functions.add(new EnchantFunction(FastMath.toIntExact(minEnchant), FastMath.toIntExact(maxEnchant), disabled, main)); + functions.add( + new EnchantFunction(FastMath.toIntExact(minEnchant), FastMath.toIntExact(maxEnchant), disabled, main)); break; } } } } - + /** * Fetches a single ItemStack from the Entry, applying all functions to it. * * @param r The Random instance to apply functions with + * * @return ItemStack - The ItemStack with all functions applied. */ public ItemStack getItem(Random r) { @@ -89,7 +93,7 @@ public class Entry { } return item; } - + /** * Gets the weight attribute of the Entry. * diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java index 8e7fd4998..d5d4ecaad 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java @@ -1,8 +1,5 @@ package com.dfsek.terra.addons.structure.structures.loot; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.inventory.Inventory; -import com.dfsek.terra.api.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -12,16 +9,22 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.inventory.Inventory; +import com.dfsek.terra.api.inventory.ItemStack; + + /** * Class representation of a Loot Table to populate chest loot. */ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { private final List pools = new ArrayList<>(); - + /** * Instantiates a LootTable from a JSON String. * * @param json The JSON String representing the loot table. + * * @throws ParseException if malformed JSON is passed. */ public LootTableImpl(String json, TerraPlugin main) throws ParseException { @@ -32,16 +35,7 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { pools.add(new Pool((JSONObject) pool, main)); } } - - @Override - public List getLoot(Random r) { - List itemList = new ArrayList<>(); - for(Pool pool : pools) { - itemList.addAll(pool.getItems(r)); - } - return itemList; - } - + @Override public void fillInventory(Inventory i, Random r) { List loot = getLoot(r); @@ -67,4 +61,13 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { } } } + + @Override + public List getLoot(Random r) { + List itemList = new ArrayList<>(); + for(Pool pool : pools) { + itemList.addAll(pool.getItems(r)); + } + return itemList; + } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java index 58bba5717..e74fd5f6f 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java @@ -1,8 +1,5 @@ package com.dfsek.terra.addons.structure.structures.loot; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.inventory.ItemStack; -import com.dfsek.terra.api.util.collection.ProbabilityCollection; import net.jafama.FastMath; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -11,6 +8,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.inventory.ItemStack; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; + + /** * Representation of a Loot Table pool, or a set of items to be fetched independently. */ @@ -18,7 +20,7 @@ public class Pool { private final int max; private final int min; private final ProbabilityCollection entries; - + /** * Instantiates a Pool from a JSON representation. * @@ -34,21 +36,22 @@ public class Pool { max = FastMath.toIntExact((Long) ((JSONObject) amount).get("max")); min = FastMath.toIntExact((Long) ((JSONObject) amount).get("min")); } - + for(Object entryJSON : (JSONArray) pool.get("entries")) { Entry entry = new Entry((JSONObject) entryJSON, main); entries.add(entry, FastMath.toIntExact(entry.getWeight())); } } - + /** * Fetches a list of items from the pool using the provided Random instance. * * @param r The Random instance to use. + * * @return List<ItemStack> - The list of items fetched. */ public List getItems(Random r) { - + int rolls = r.nextInt(max - min + 1) + min; List items = new ArrayList<>(); for(int i = 0; i < rolls; i++) { diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java index 8b2780dbc..c97ea4eaa 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java @@ -1,9 +1,10 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; +import java.util.Random; + import com.dfsek.terra.api.inventory.ItemStack; -import java.util.Random; /** * Loot LootFunction fot setting the amount of an item. @@ -11,7 +12,7 @@ import java.util.Random; public class AmountFunction implements LootFunction { private final int max; private final int min; - + /** * Instantiates an AmountFunction. * @@ -22,12 +23,13 @@ public class AmountFunction implements LootFunction { this.min = min; this.max = max; } - + /** * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. * @param r The Random instance to use. + * * @return - ItemStack - The mutated ItemStack. */ @Override diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java index 2643cc7f0..d778f13c9 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java @@ -1,10 +1,11 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; +import java.util.Random; + import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.item.Damageable; import com.dfsek.terra.api.inventory.item.ItemMeta; -import java.util.Random; /** * Loot LootFunction for setting the damage on items in Loot Tables @@ -12,7 +13,7 @@ import java.util.Random; public class DamageFunction implements LootFunction { private final int max; private final int min; - + /** * Instantiates a DamageFunction. * @@ -23,12 +24,13 @@ public class DamageFunction implements LootFunction { this.min = min; this.max = max; } - + /** * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. * @param r The Random instance to use. + * * @return - ItemStack - The mutated ItemStack. */ @Override diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java index df14c5472..b64b1808d 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java @@ -1,9 +1,5 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.inventory.ItemStack; -import com.dfsek.terra.api.inventory.item.Enchantment; -import com.dfsek.terra.api.inventory.item.ItemMeta; import net.jafama.FastMath; import org.json.simple.JSONArray; @@ -12,31 +8,38 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.inventory.ItemStack; +import com.dfsek.terra.api.inventory.item.Enchantment; +import com.dfsek.terra.api.inventory.item.ItemMeta; + + public class EnchantFunction implements LootFunction { private final int min; private final int max; private final JSONArray disabled; private final TerraPlugin main; - - + + public EnchantFunction(int min, int max, JSONArray disabled, TerraPlugin main) { this.max = max; this.min = min; this.disabled = disabled; this.main = main; } - + /** * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. * @param r The Random instance to use. + * * @return - ItemStack - The mutated ItemStack. */ @Override public ItemStack apply(ItemStack original, Random r) { if(original.getItemMeta() == null) return original; - + double enchant = (r.nextDouble() * (max - min)) + min; List possible = new ArrayList<>(); for(Enchantment ench : main.getItemHandle().getEnchantments()) { @@ -57,7 +60,9 @@ public class EnchantFunction implements LootFunction { try { meta.addEnchantment(chosen, FastMath.max(lvl, 1)); } catch(IllegalArgumentException e) { - main.logger().warning("Attempted to enchant " + original.getType() + " with " + chosen + " at level " + FastMath.max(lvl, 1) + ", but an unexpected exception occurred! Usually this is caused by a misbehaving enchantment plugin."); + main.logger().warning( + "Attempted to enchant " + original.getType() + " with " + chosen + " at level " + FastMath.max(lvl, 1) + + ", but an unexpected exception occurred! Usually this is caused by a misbehaving enchantment plugin."); } } original.setItemMeta(meta); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java index 5d0f1e97b..eaeebae71 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java @@ -1,9 +1,10 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; +import java.util.Random; + import com.dfsek.terra.api.inventory.ItemStack; -import java.util.Random; /** * Interface for mutating items in Loot Tables. @@ -14,6 +15,7 @@ public interface LootFunction { * * @param original The ItemStack on which to apply the function. * @param r The Random instance to use. + * * @return - ItemStack - The mutated ItemStack. */ ItemStack apply(ItemStack original, Random r); diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java index 4aefa0982..031d7eb78 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/ColumnImpl.java @@ -4,42 +4,43 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.world.Column; import com.dfsek.terra.api.world.World; + public class ColumnImpl implements Column { private final int x; private final int z; private final World world; - + public ColumnImpl(int x, int z, World world) { this.x = x; this.z = z; this.world = world; } - + @Override public int getX() { return x; } - + @Override public int getZ() { return z; } - + @Override public BlockState getBlock(int y) { return world.getBlockData(x, y, z); } - + @Override public World getWorld() { return world; } - + @Override public int getMinY() { return world.getMinHeight(); } - + @Override public int getMaxY() { return world.getMaxHeight(); diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java index 884e36578..5cbec0467 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java @@ -13,29 +13,32 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.GenerationStageProvider; + @Addon("generation-stage-feature") @Version("1.0.0") @Author("Terra") public class FeatureGenerationAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("FEATURE", pack -> new FeatureGenerationStage(main))) - .failThrough(); - + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack() + .getOrCreateRegistry(GenerationStageProvider.class) + .register("FEATURE", pack -> new FeatureGenerationStage(main))) + .failThrough(); + main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigurationLoadEvent.class) - .then(event -> { - if(event.is(TerraBiome.class)) { - event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeFeaturesTemplate()).get()); - } - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationLoadEvent.class) + .then(event -> { + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeFeaturesTemplate()).get()); + } + }) + .failThrough(); } } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index 1d228df30..58814f7fd 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -10,13 +10,14 @@ import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.generator.GenerationStage; + public class FeatureGenerationStage implements GenerationStage { private final TerraPlugin main; - + public FeatureGenerationStage(TerraPlugin main) { this.main = main; } - + @Override @SuppressWarnings("try") public void populate(World world, Chunk chunk) { @@ -32,11 +33,12 @@ public class FeatureGenerationStage implements GenerationStage { world.getBiomeProvider().getBiome(tx, tz, seed).getContext().get(BiomeFeatures.class).getFeatures().forEach(feature -> { if(feature.getDistributor().matches(tx, tz, seed)) { feature.getLocator() - .getSuitableCoordinates(column) - .forEach(y -> - feature.getStructure(world, tx, y, tz) - .generate(new Vector3(tx, y, tz), world, PopulationUtil.getRandom(chunk), Rotation.NONE) - ); + .getSuitableCoordinates(column) + .forEach(y -> + feature.getStructure(world, tx, y, tz) + .generate(new Vector3(tx, y, tz), world, PopulationUtil.getRandom(chunk), + Rotation.NONE) + ); } }); } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java index bcf7d67a3..19fe4d503 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeatures.java @@ -1,17 +1,18 @@ package com.dfsek.terra.addons.generation.feature.config; +import java.util.List; + import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.structure.feature.Feature; -import java.util.List; public class BiomeFeatures implements Properties { private final List features; - + public BiomeFeatures(List features) { this.features = features; } - + public List getFeatures() { return features; } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java index 8388f9d01..ae25042ae 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/BiomeFeaturesTemplate.java @@ -3,17 +3,19 @@ package com.dfsek.terra.addons.generation.feature.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.structure.feature.Feature; import java.util.Collections; import java.util.List; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Feature; + + public class BiomeFeaturesTemplate implements ObjectTemplate { @Value("features") @Default - private @Meta List<@Meta Feature> features = Collections.emptyList(); - + private final @Meta List<@Meta Feature> features = Collections.emptyList(); + @Override public BiomeFeatures get() { return new BiomeFeatures(features); diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFlora.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFlora.java index dc4b5e789..fc28166ed 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFlora.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFlora.java @@ -1,16 +1,17 @@ package com.dfsek.terra.addons.generation.flora; -import com.dfsek.terra.api.properties.Properties; - import java.util.List; +import com.dfsek.terra.api.properties.Properties; + + public class BiomeFlora implements Properties { private final List layers; - + public BiomeFlora(List layers) { this.layers = layers; } - + public List getLayers() { return layers; } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFloraTemplate.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFloraTemplate.java index 0ada6c783..7f386b5d3 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFloraTemplate.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/BiomeFloraTemplate.java @@ -3,16 +3,18 @@ package com.dfsek.terra.addons.generation.flora; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.config.meta.Meta; import java.util.Collections; import java.util.List; +import com.dfsek.terra.api.config.meta.Meta; + + public class BiomeFloraTemplate implements ObjectTemplate { @Value("flora") @Default - private @Meta List<@Meta FloraLayer> flora = Collections.emptyList(); - + private final @Meta List<@Meta FloraLayer> flora = Collections.emptyList(); + @Override public BiomeFlora get() { return new BiomeFlora(flora); diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java index 01f03d4ef..9e86b3b8a 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationAddon.java @@ -12,33 +12,35 @@ import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.generator.GenerationStageProvider; + @Addon("generation-stage-flora") @Version("1.0.0") @Author("Terra") public class FloraGenerationAddon extends TerraAddon { - + @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - event.getPack().applyLoader(FloraLayer.class, FloraLayerLoader::new); - event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("FLORA", pack -> new FloraGenerationStage(main)); - }) - .failThrough(); - + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + event.getPack().applyLoader(FloraLayer.class, FloraLayerLoader::new); + event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("FLORA", + pack -> new FloraGenerationStage(main)); + }) + .failThrough(); + main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigurationLoadEvent.class) - .then(event -> { - if(event.is(TerraBiome.class)) { - event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeFloraTemplate()).get()); - } - }) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationLoadEvent.class) + .then(event -> { + if(event.is(TerraBiome.class)) { + event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomeFloraTemplate()).get()); + } + }) + .failThrough(); } } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java index 8957fad87..7c1d83683 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java @@ -1,5 +1,12 @@ package com.dfsek.terra.addons.generation.flora; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.profiler.ProfileFrame; import com.dfsek.terra.api.util.PopulationUtil; @@ -8,41 +15,39 @@ import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.GenerationStage; -import org.jetbrains.annotations.NotNull; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; /** * Populates Flora */ public class FloraGenerationStage implements GenerationStage { private final TerraPlugin main; - + public FloraGenerationStage(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { try(ProfileFrame ignore = main.getProfiler().profile("flora")) { if(world.getConfig().disableFlora()) return; - + long seed = world.getSeed(); BiomeProvider provider = world.getBiomeProvider(); Map> layers = new HashMap<>(); for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { Vector2 l = new Vector2(x, z); - layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, seed).getContext().get(BiomeFlora.class).getLayers()); + layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, seed) + .getContext() + .get(BiomeFlora.class) + .getLayers()); } } - + Random random = PopulationUtil.getRandom(chunk); - + int iter = 0; boolean finished = false; while(!finished) { diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java index 7f8c23b30..3928383d8 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java @@ -7,39 +7,41 @@ import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.Flora; + public class FloraLayer { protected final double density; protected final Range level; protected final ProbabilityCollection layer; protected final NoiseSampler noise; - + public FloraLayer(double density, Range level, ProbabilityCollection layer, NoiseSampler noise) { this.density = density; this.level = level; this.layer = layer; this.noise = noise; } - - public NoiseSampler getNoise() { - return noise; - } - - public double getDensity() { - return density; - } - - public Range getLevel() { - return level; - } - - public ProbabilityCollection getLayer() { - return layer; - } - + public void place(Chunk chunk, Vector2 coords) { int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); Flora item = layer.get(noise, cx + coords.getX(), cz + coords.getZ(), chunk.getWorld().getSeed()); - item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.add(cx, 0, cz), chunk.getWorld())); + item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach( + block -> item.plant(block.add(cx, 0, cz), chunk.getWorld())); + } + + public NoiseSampler getNoise() { + return noise; + } + + public double getDensity() { + return density; + } + + public Range getLevel() { + return level; + } + + public ProbabilityCollection getLayer() { + return layer; } } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java index 4743c6a0b..36b10442b 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayerLoader.java @@ -2,26 +2,28 @@ package com.dfsek.terra.addons.generation.flora; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.Flora; + public class FloraLayerLoader implements ObjectTemplate { @Value("density") private @Meta double density; - + @Value("y") private @Meta Range y; - + @Value("items") private @Meta ProbabilityCollection<@Meta Flora> items; - + @Value("distribution") private @Meta NoiseSampler distribution; - - + + @Override public FloraLayer get() { return new FloraLayer(density, y, items, distribution); diff --git a/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java b/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java index f6b61e69a..53ed6b2b4 100644 --- a/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java +++ b/common/addons/language-yaml/src/main/java/com/dfsek/terra/addons/yaml/YamlAddon.java @@ -1,6 +1,7 @@ package com.dfsek.terra.addons.yaml; import com.dfsek.tectonic.yaml.YamlConfiguration; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.annotations.Addon; @@ -10,22 +11,23 @@ import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.injection.annotations.Inject; + @Addon("language-yaml") @Version("1.0.0") @Author("Terra") public class YamlAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigurationDiscoveryEvent.class) - .then(event -> event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> { - main.getDebugLogger().info("Discovered config " + entry.getKey()); - event.register(entry.getKey(), new YamlConfiguration(entry.getValue(), entry.getKey())); - }))) - .failThrough(); + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationDiscoveryEvent.class) + .then(event -> event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> { + main.getDebugLogger().info("Discovered config " + entry.getKey()); + event.register(entry.getKey(), new YamlConfiguration(entry.getValue(), entry.getKey())); + }))) + .failThrough(); } } diff --git a/common/addons/structure-terrascript-loader/README.md b/common/addons/structure-terrascript-loader/README.md index 1cfd954f7..5bf8f622a 100644 --- a/common/addons/structure-terrascript-loader/README.md +++ b/common/addons/structure-terrascript-loader/README.md @@ -1,4 +1,4 @@ # structure-terrascript-loader -Implements the TerraScript structure scripting language, and loads all `*.tesf` files -into the Structure registry. \ No newline at end of file +Implements the TerraScript structure scripting language, and loads all `*.tesf` +files into the Structure registry. \ No newline at end of file diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java index b60ebb2aa..6857c2bf0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java @@ -1,6 +1,10 @@ package com.dfsek.terra.addons.terrascript; import com.dfsek.tectonic.exception.LoadException; + +import java.io.InputStream; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.api.TerraPlugin; @@ -15,8 +19,6 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; -import java.io.InputStream; -import java.util.Map; @Addon("structure-terrascript-loader") @Author("Terra") @@ -24,26 +26,27 @@ import java.util.Map; public class TerraScriptAddon extends TerraAddon { @Inject private TerraPlugin main; - + @Override public void initialize() { main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); - CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); - event.getPack().getLoader().open("", ".tesf").thenEntries(entries -> { - for(Map.Entry entry : entries) { - try { - StructureScript structureScript = new StructureScript(entry.getValue(), main, structureRegistry, lootRegistry, event.getPack().getRegistryFactory().create()); - structureRegistry.register(structureScript.getID(), structureScript); - } catch(ParseException e) { - throw new LoadException("Failed to load script: ", e); - } + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); + CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); + event.getPack().getLoader().open("", ".tesf").thenEntries(entries -> { + for(Map.Entry entry : entries) { + try { + StructureScript structureScript = new StructureScript(entry.getValue(), main, structureRegistry, lootRegistry, + event.getPack().getRegistryFactory().create()); + structureRegistry.register(structureScript.getID(), structureScript); + } catch(ParseException e) { + throw new LoadException("Failed to load script: ", e); } - }).close(); - }) - .failThrough(); + } + }).close(); + }) + .failThrough(); } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/Cell.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/Cell.java index 534e57c5b..53f7b939a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/Cell.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/Cell.java @@ -1,29 +1,30 @@ package com.dfsek.terra.addons.terrascript.buffer; +import java.util.ArrayList; +import java.util.List; + import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; -import java.util.ArrayList; -import java.util.List; public class Cell implements BufferedItem { private final List items = new ArrayList<>(); - private String mark = null; - + private String mark; + @Override public void paste(Vector3 origin, World world) { items.forEach(item -> item.paste(origin.clone(), world)); } - + public void add(BufferedItem item) { items.add(item); } - + public String getMark() { return mark; } - + public void setMark(String mark) { this.mark = mark; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/DirectBuffer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/DirectBuffer.java index 71adec30f..b586c1792 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/DirectBuffer.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/DirectBuffer.java @@ -1,13 +1,14 @@ package com.dfsek.terra.addons.terrascript.buffer; +import java.util.LinkedHashMap; +import java.util.Map; + import com.dfsek.terra.api.structure.buffer.Buffer; import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; -import java.util.LinkedHashMap; -import java.util.Map; /** * Buffer implementation that directly pastes to the world. @@ -16,41 +17,41 @@ public class DirectBuffer implements Buffer { private final Vector3 origin; private final World target; private final Map marks = new LinkedHashMap<>(); - + public DirectBuffer(Vector3 origin, World target) { this.origin = origin; this.target = target; } - + @Override public void paste(Vector3 origin, Chunk chunk) { // no-op } - + @Override public void paste(Vector3 origin, World world) { // no-op } - + @Override public Buffer addItem(BufferedItem item, Vector3 location) { item.paste(origin.clone().add(location), target); return this; } - - @Override - public Vector3 getOrigin() { - return origin; - } - - @Override - public String getMark(Vector3 location) { - return marks.get(location); - } - + @Override public Buffer setMark(String mark, Vector3 location) { marks.put(location, mark); return this; } + + @Override + public Vector3 getOrigin() { + return origin; + } + + @Override + public String getMark(Vector3 location) { + return marks.get(location); + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/IntermediateBuffer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/IntermediateBuffer.java index 4c59a1cf9..9c29f55de 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/IntermediateBuffer.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/IntermediateBuffer.java @@ -6,43 +6,44 @@ import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; + public class IntermediateBuffer implements Buffer { private final Buffer original; private final Vector3 offset; - + public IntermediateBuffer(Buffer original, Vector3 offset) { this.original = original; this.offset = offset.clone(); } - + @Override public void paste(Vector3 origin, Chunk chunk) { // no-op } - + @Override public void paste(Vector3 origin, World world) { // no-op } - + @Override public Buffer addItem(BufferedItem item, Vector3 location) { return original.addItem(item, location.clone().add(offset)); } - - @Override - public Vector3 getOrigin() { - return original.getOrigin().clone().add(offset); - } - - @Override - public String getMark(Vector3 location) { - return original.getMark(location.clone().add(offset)); - } - + @Override public Buffer setMark(String mark, Vector3 location) { original.setMark(mark, location.clone().add(offset)); return this; } + + @Override + public Vector3 getOrigin() { + return original.getOrigin().clone().add(offset); + } + + @Override + public String getMark(Vector3 location) { + return original.getMark(location.clone().add(offset)); + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/StructureBuffer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/StructureBuffer.java index 79025f0d5..5c26ab61c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/StructureBuffer.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/StructureBuffer.java @@ -1,28 +1,26 @@ package com.dfsek.terra.addons.terrascript.buffer; +import net.jafama.FastMath; + +import java.util.LinkedHashMap; +import java.util.Map; + import com.dfsek.terra.api.structure.buffer.Buffer; import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; -import net.jafama.FastMath; -import java.util.LinkedHashMap; -import java.util.Map; public class StructureBuffer implements Buffer { private final Map bufferedItemMap = new LinkedHashMap<>(); private final Vector3 origin; private boolean succeeded; - + public StructureBuffer(Vector3 origin) { this.origin = origin; } - - public void paste(Vector3 origin, World world) { - bufferedItemMap.forEach(((vector3, item) -> item.paste(origin.clone().add(vector3), world))); - } - + public void paste(Vector3 origin, Chunk chunk) { bufferedItemMap.forEach(((location, item) -> { Vector3 current = origin.clone().add(location); @@ -31,13 +29,28 @@ public class StructureBuffer implements Buffer { item.paste(current, chunk.getWorld()); })); } - + + public void paste(Vector3 origin, World world) { + bufferedItemMap.forEach(((vector3, item) -> item.paste(origin.clone().add(vector3), world))); + } + @Override public Buffer addItem(BufferedItem item, Vector3 location) { bufferedItemMap.computeIfAbsent(location.clone(), l -> new Cell()).add(item); return this; } - + + @Override + public Buffer setMark(String mark, Vector3 location) { + bufferedItemMap.computeIfAbsent(location.clone(), l -> new Cell()).setMark(mark); + return this; + } + + @Override + public Vector3 getOrigin() { + return origin.clone(); + } + @Override public String getMark(Vector3 location) { Cell cell = bufferedItemMap.get(location); @@ -46,23 +59,12 @@ public class StructureBuffer implements Buffer { } return null; } - - @Override - public Buffer setMark(String mark, Vector3 location) { - bufferedItemMap.computeIfAbsent(location.clone(), l -> new Cell()).setMark(mark); - return this; - } - - public void setSucceeded(boolean succeeded) { - this.succeeded = succeeded; - } - + public boolean succeeded() { return succeeded; } - - @Override - public Vector3 getOrigin() { - return origin.clone(); + + public void setSucceeded(boolean succeeded) { + this.succeeded = succeeded; } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedBlock.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedBlock.java index 0ccaaa938..6ea90fe5b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedBlock.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedBlock.java @@ -7,19 +7,20 @@ import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; + public class BufferedBlock implements BufferedItem { private final BlockState data; private final boolean overwrite; private final TerraPlugin main; private final boolean waterlog; - + public BufferedBlock(BlockState data, boolean overwrite, TerraPlugin main, boolean waterlog) { this.data = data; this.overwrite = overwrite; this.main = main; this.waterlog = waterlog; } - + @Override public void paste(Vector3 origin, World world) { try { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedEntity.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedEntity.java index 300b9c989..685503fb4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedEntity.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedEntity.java @@ -8,16 +8,17 @@ import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; -public class BufferedEntity implements BufferedItem { +public class BufferedEntity implements BufferedItem { + private final EntityType type; private final TerraPlugin main; - + public BufferedEntity(EntityType type, TerraPlugin main) { this.type = type; this.main = main; } - + @Override public void paste(Vector3 origin, World world) { Entity entity = world.spawnEntity(origin.clone().add(0.5, 0, 0.5), type); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedLootApplication.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedLootApplication.java index 176184216..c6e350f3e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedLootApplication.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedLootApplication.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.buffer.items; +import java.util.Random; + import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.block.entity.BlockEntity; @@ -10,19 +12,18 @@ import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; -import java.util.Random; public class BufferedLootApplication implements BufferedItem { private final LootTable table; private final TerraPlugin main; private final StructureScript structure; - + public BufferedLootApplication(LootTable table, TerraPlugin main, StructureScript structure) { this.table = table; this.main = main; this.structure = structure; } - + @Override public void paste(Vector3 origin, World world) { try { @@ -32,11 +33,11 @@ public class BufferedLootApplication implements BufferedItem { return; } Container container = (Container) data; - + LootPopulateEvent event = new LootPopulateEvent(container, table, world.getConfig().getPack(), structure); main.getEventManager().callEvent(event); if(event.isCancelled()) return; - + event.getTable().fillInventory(container.getInventory(), new Random(origin.hashCode())); data.update(false); } catch(Exception e) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedPulledBlock.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedPulledBlock.java index 2073a0105..880061df3 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedPulledBlock.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedPulledBlock.java @@ -5,13 +5,14 @@ import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; + public class BufferedPulledBlock implements BufferedItem { private final BlockState data; - + public BufferedPulledBlock(BlockState data) { this.data = data; } - + @Override public void paste(Vector3 origin, World world) { Vector3 mutable = origin.clone(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedStateManipulator.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedStateManipulator.java index 769f29f26..7181e1f47 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedStateManipulator.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/buffer/items/BufferedStateManipulator.java @@ -6,15 +6,16 @@ import com.dfsek.terra.api.structure.buffer.BufferedItem; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; + public class BufferedStateManipulator implements BufferedItem { private final TerraPlugin main; private final String data; - + public BufferedStateManipulator(TerraPlugin main, String state) { this.main = main; this.data = state; } - + @Override public void paste(Vector3 origin, World world) { try { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java index b359e7b08..4aeefabf0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java @@ -1,5 +1,11 @@ package com.dfsek.terra.addons.terrascript.parser; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.Item; @@ -42,66 +48,57 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.Token; import com.dfsek.terra.addons.terrascript.tokenizer.Tokenizer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; @SuppressWarnings("unchecked") public class Parser { private final String data; private final Map>> functions = new HashMap<>(); private final List ignoredFunctions = new ArrayList<>(); - + private String id; - + public Parser(String data) { this.data = data; } - + public Parser registerFunction(String name, FunctionBuilder> functionBuilder) { functions.put(name, functionBuilder); return this; } - + public Parser ignoreFunction(String name) { ignoredFunctions.add(name); return this; } - - public String getID() { - return id; - } - + /** * Parse input * * @return executable {@link Block} + * * @throws ParseException If parsing fails. */ public Block parse() throws ParseException { Tokenizer tokens = new Tokenizer(data); - + // Parse ID ParserUtil.checkType(tokens.consume(), Token.Type.ID); // First token must be ID Token idToken = tokens.get(); ParserUtil.checkType(tokens.consume(), Token.Type.STRING); // Second token must be string literal containing ID ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); this.id = idToken.getContent(); - - + + return parseBlock(tokens, new HashMap<>(), false); } - - + private Keyword parseLoopLike(Tokenizer tokens, Map variableMap, boolean loop) throws ParseException { - + Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); - + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); - + switch(identifier.getType()) { case FOR_LOOP: return parseForLoop(tokens, variableMap, identifier.getPosition()); @@ -113,27 +110,29 @@ public class Parser { throw new UnsupportedOperationException("Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); } } - - private WhileKeyword parseWhileLoop(Tokenizer tokens, Map variableMap, Position start) throws ParseException { + + private WhileKeyword parseWhileLoop(Tokenizer tokens, Map variableMap, Position start) + throws ParseException { Returnable first = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); - + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - + return new WhileKeyword(parseStatementBlock(tokens, variableMap, true), (Returnable) first, start); // While loop } - - private IfKeyword parseIfStatement(Tokenizer tokens, Map variableMap, Position start, boolean loop) throws ParseException { + + private IfKeyword parseIfStatement(Tokenizer tokens, Map variableMap, Position start, boolean loop) + throws ParseException { Returnable condition = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); - + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - + Block elseBlock = null; Block statement = parseStatementBlock(tokens, variableMap, loop); - + List, Block>> elseIf = new ArrayList<>(); - + while(tokens.hasNext() && tokens.get().getType().equals(Token.Type.ELSE)) { tokens.consume(); // Consume else. if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { @@ -146,12 +145,13 @@ public class Parser { break; // Else must be last. } } - + return new IfKeyword(statement, (Returnable) condition, elseIf, elseBlock, start); // If statement } - - private Block parseStatementBlock(Tokenizer tokens, Map variableMap, boolean loop) throws ParseException { - + + private Block parseStatementBlock(Tokenizer tokens, Map variableMap, boolean loop) + throws ParseException { + if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); Block block = parseBlock(tokens, variableMap, loop); @@ -164,7 +164,7 @@ public class Parser { return block; } } - + private ForKeyword parseForLoop(Tokenizer tokens, Map old, Position start) throws ParseException { Map variableMap = new HashMap<>(old); // New scope Token f = tokens.get(); @@ -181,19 +181,21 @@ public class Parser { Returnable conditional = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - + Item incrementer; Token token = tokens.get(); if(variableMap.containsKey(token.getContent())) { // Assume variable assignment incrementer = parseAssignment(tokens, variableMap); } else incrementer = parseFunction(tokens, true, variableMap); - + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - - return new ForKeyword(parseStatementBlock(tokens, variableMap, true), initializer, (Returnable) conditional, incrementer, start); + + return new ForKeyword(parseStatementBlock(tokens, variableMap, true), initializer, (Returnable) conditional, incrementer, + start); } - - private Returnable parseExpression(Tokenizer tokens, boolean full, Map variableMap) throws ParseException { + + private Returnable parseExpression(Tokenizer tokens, boolean full, Map variableMap) + throws ParseException { boolean booleanInverted = false; // Check for boolean not operator boolean negate = false; if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { @@ -203,11 +205,11 @@ public class Parser { negate = true; tokens.consume(); } - + Token id = tokens.get(); - + ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN); - + Returnable expression; if(id.isConstant()) { expression = parseConstantExpression(tokens); @@ -221,7 +223,7 @@ public class Parser { expression = new Getter(id.getContent(), id.getPosition(), variableMap.get(id.getContent())); } else throw new ParseException("Unexpected token \" " + id.getContent() + "\"", id.getPosition()); } - + if(booleanInverted) { // Invert operation if boolean not detected ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); @@ -229,13 +231,13 @@ public class Parser { ParserUtil.checkReturnType(expression, Returnable.ReturnType.NUMBER); expression = new NegationOperation((Returnable) expression, expression.getPosition()); } - + if(full && tokens.get().isBinaryOperator()) { // Parse binary operations return parseBinaryOperation(expression, tokens, variableMap); } return expression; } - + private ConstantExpression parseConstantExpression(Tokenizer tokens) throws ParseException { Token constantToken = tokens.consume(); Position position = constantToken.getPosition(); @@ -248,24 +250,25 @@ public class Parser { case BOOLEAN: return new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position); default: - throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position); + throw new UnsupportedOperationException( + "Unsupported constant token: " + constantToken.getType() + " at position: " + position); } } - + private Returnable parseGroup(Tokenizer tokens, Map variableMap) throws ParseException { ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); Returnable expression = parseExpression(tokens, true, variableMap); // Parse inside of group as a separate expression ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); return expression; } - - - private BinaryOperation parseBinaryOperation(Returnable left, Tokenizer tokens, Map variableMap) throws ParseException { + + private BinaryOperation parseBinaryOperation(Returnable left, Tokenizer tokens, Map variableMap) + throws ParseException { Token binaryOperator = tokens.consume(); ParserUtil.checkBinaryOperator(binaryOperator); - + Returnable right = parseExpression(tokens, false, variableMap); - + Token other = tokens.get(); if(ParserUtil.hasPrecedence(binaryOperator.getType(), other.getType())) { return assemble(left, parseBinaryOperation(right, tokens, variableMap), binaryOperator); @@ -274,7 +277,7 @@ public class Parser { } return assemble(left, right, binaryOperator); } - + private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { if(binaryOperator.isStrictNumericOperator()) ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking @@ -300,7 +303,8 @@ public class Parser { case LESS_THAN_OPERATOR: return new LessThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case GREATER_THAN_OR_EQUALS_OPERATOR: - return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, + binaryOperator.getPosition()); case LESS_THAN_OR_EQUALS_OPERATOR: return new LessThanOrEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case BOOLEAN_AND: @@ -313,35 +317,37 @@ public class Parser { throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); } } - - private Declaration parseVariableDeclaration(Tokenizer tokens, Map variableMap) throws ParseException { + + private Declaration parseVariableDeclaration(Tokenizer tokens, Map variableMap) + throws ParseException { Token type = tokens.consume(); ParserUtil.checkType(type, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); - + Returnable.ReturnType returnType = ParserUtil.getVariableReturnType(type); - + ParserUtil.checkVarType(type, returnType); // Check for type mismatch Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); if(functions.containsKey(identifier.getContent()) || variableMap.containsKey(identifier.getContent())) throw new ParseException(identifier.getContent() + " is already defined in this scope", identifier.getPosition()); ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); - + Returnable value = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(value, returnType); - + variableMap.put(identifier.getContent(), returnType); - + return new Declaration<>(tokens.get().getPosition(), identifier.getContent(), value, returnType); } - + private Block parseBlock(Tokenizer tokens, Map superVars, boolean loop) throws ParseException { List> parsedItems = new ArrayList<>(); - - Map parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. - + + Map parsedVariables = new HashMap<>( + superVars); // New hashmap as to not mutate parent scope's declarations. + Token first = tokens.get(); - + while(tokens.hasNext()) { Token token = tokens.get(); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. @@ -353,14 +359,16 @@ public class Parser { } return new Block(parsedItems, first.getPosition()); } - + private Item parseItem(Tokenizer tokens, Map variableMap, boolean loop) throws ParseException { Token token = tokens.get(); if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, - Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, + Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); else ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, - Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.FAIL); - + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, + Token.Type.FAIL); + if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) return parseLoopLike(tokens, variableMap, loop); } else if(token.isIdentifier()) { // Parse identifiers @@ -368,71 +376,76 @@ public class Parser { return parseAssignment(tokens, variableMap); } else return parseFunction(tokens, true, variableMap); } else if(token.isVariableDeclaration()) { - + return parseVariableDeclaration(tokens, variableMap); - + } else if(token.getType().equals(Token.Type.RETURN)) return new ReturnKeyword(tokens.consume().getPosition()); else if(token.getType().equals(Token.Type.BREAK)) return new BreakKeyword(tokens.consume().getPosition()); else if(token.getType().equals(Token.Type.CONTINUE)) return new ContinueKeyword(tokens.consume().getPosition()); else if(token.getType().equals(Token.Type.FAIL)) return new FailKeyword(tokens.consume().getPosition()); else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); } - + private Assignment parseAssignment(Tokenizer tokens, Map variableMap) throws ParseException { Token identifier = tokens.consume(); - + ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); - + ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); - + Returnable value = parseExpression(tokens, true, variableMap); - + ParserUtil.checkReturnType(value, variableMap.get(identifier.getContent())); - + return new Assignment<>(value, identifier.getContent(), identifier.getPosition()); } - - private Function parseFunction(Tokenizer tokens, boolean fullStatement, Map variableMap) throws ParseException { + + private Function parseFunction(Tokenizer tokens, boolean fullStatement, Map variableMap) + throws ParseException { Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier - + if(!functions.containsKey(identifier.getContent())) throw new ParseException("No such function \"" + identifier.getContent() + "\"", identifier.getPosition()); - + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin - - + + List> args = getArgs(tokens, variableMap); // Extract arguments, consume the rest. - + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); // Remove body end - + if(fullStatement) ParserUtil.checkType(tokens.get(), Token.Type.STATEMENT_END); - + if(ignoredFunctions.contains(identifier.getContent())) { return Function.NULL; } - + if(functions.containsKey(identifier.getContent())) { FunctionBuilder builder = functions.get(identifier.getContent()); - + if(builder.argNumber() != -1 && args.size() != builder.argNumber()) throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size(), identifier.getPosition()); - + for(int i = 0; i < args.size(); i++) { Returnable argument = args.get(i); if(builder.getArgument(i) == null) - throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(), identifier.getPosition()); + throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(), + identifier.getPosition()); ParserUtil.checkReturnType(argument, builder.getArgument(i)); } return builder.build(args, identifier.getPosition()); } throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); } - - + + public String getID() { + return id; + } + private List> getArgs(Tokenizer tokens, Map variableMap) throws ParseException { List> args = new ArrayList<>(); - + while(!tokens.get().getType().equals(Token.Type.GROUP_END)) { args.add(parseExpression(tokens, true, variableMap)); ParserUtil.checkType(tokens.get(), Token.Type.SEPARATOR, Token.Type.GROUP_END); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java index 3e3d7aa48..737efebcd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java @@ -1,83 +1,94 @@ package com.dfsek.terra.addons.terrascript.parser; -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.tokenizer.Token; - import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.tokenizer.Token; + + public class ParserUtil { - + private static final Map> PRECEDENCE = new HashMap<>(); // If second has precedence, true. - private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.MODULO_OPERATOR); - private static final List COMPARISON = Arrays.asList(Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR); - + private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, + Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, + Token.Type.MODULO_OPERATOR); + private static final List COMPARISON = Arrays.asList(Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, + Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, + Token.Type.GREATER_THAN_OPERATOR, + Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR); + static { // Setup precedence Map add = new HashMap<>(); // Addition/subtraction before Multiplication/division. add.put(Token.Type.MULTIPLICATION_OPERATOR, true); add.put(Token.Type.DIVISION_OPERATOR, true); - + PRECEDENCE.put(Token.Type.ADDITION_OPERATOR, add); PRECEDENCE.put(Token.Type.SUBTRACTION_OPERATOR, add); - + Map numericBoolean = new HashMap<>(); - + ARITHMETIC.forEach(op -> numericBoolean.put(op, true)); // Numbers before comparison COMPARISON.forEach(op -> PRECEDENCE.put(op, numericBoolean)); - - + + Map booleanOps = new HashMap<>(); ARITHMETIC.forEach(op -> booleanOps.put(op, true)); // Everything before boolean COMPARISON.forEach(op -> booleanOps.put(op, true)); - - + + PRECEDENCE.put(Token.Type.BOOLEAN_AND, booleanOps); PRECEDENCE.put(Token.Type.BOOLEAN_OR, booleanOps); } - + public static void checkType(Token token, Token.Type... expected) throws ParseException { for(Token.Type type : expected) if(token.getType().equals(type)) return; throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType(), token.getPosition()); } - + public static void checkReturnType(Returnable returnable, Returnable.ReturnType... types) throws ParseException { for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType(), returnable.getPosition()); } - + public static void checkArithmeticOperation(Returnable left, Returnable right, Token operation) throws ParseException { if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { - throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), operation.getPosition()); + throw new ParseException( + "Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), + operation.getPosition()); } } - + public static void checkBooleanOperation(Returnable left, Returnable right, Token operation) throws ParseException { if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { - throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), operation.getPosition()); + throw new ParseException( + "Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), + operation.getPosition()); } } - + public static void checkVarType(Token token, Returnable.ReturnType returnType) throws ParseException { if(returnType.equals(Returnable.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return; if(returnType.equals(Returnable.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return; if(returnType.equals(Returnable.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return; throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType(), token.getPosition()); } - + /** * Checks if token is a binary operator * * @param token Token to check + * * @throws ParseException If token isn't a binary operator */ public static void checkBinaryOperator(Token token) throws ParseException { if(!token.isBinaryOperator()) throw new ParseException("Expected binary operator, found " + token.getType(), token.getPosition()); } - + public static Returnable.ReturnType getVariableReturnType(Token varToken) throws ParseException { switch(varToken.getType()) { case NUMBER_VARIABLE: @@ -87,10 +98,11 @@ public class ParserUtil { case BOOLEAN_VARIABLE: return Returnable.ReturnType.BOOLEAN; default: - throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration", varToken.getPosition()); + throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration", + varToken.getPosition()); } } - + public static boolean hasPrecedence(Token.Type first, Token.Type second) { if(!PRECEDENCE.containsKey(first)) return false; Map pre = PRECEDENCE.get(first); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java index f9e6a26b2..f016b3700 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java @@ -2,25 +2,26 @@ package com.dfsek.terra.addons.terrascript.parser.exceptions; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class ParseException extends Exception { private static final long serialVersionUID = 6744390543046766386L; private final Position position; - + public ParseException(String message, Position position) { super(message); this.position = position; } - + public ParseException(String message, Position position, Throwable cause) { super(message, cause); this.position = position; } - + @Override public String getMessage() { return super.getMessage() + ": " + position; } - + public Position getPosition() { return position; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java index 320bac664..cf9b15c1c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java @@ -1,29 +1,26 @@ package com.dfsek.terra.addons.terrascript.parser.lang; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; -import com.dfsek.terra.addons.terrascript.tokenizer.Position; - import java.util.HashMap; import java.util.List; import java.util.Map; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; + + public class Block implements Item> { private final List> items; private final Position position; - + public Block(List> items, Position position) { this.items = items; this.position = position; } - - public List> getItems() { - return items; - } - + public ReturnInfo apply(ImplementationArguments implementationArguments) { return apply(implementationArguments, new HashMap<>()); } - + @Override public ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { Map> scope = new HashMap<>(variableMap); @@ -36,39 +33,48 @@ public class Block implements Item> { } return new ReturnInfo<>(ReturnLevel.NONE, null); } - + @Override public Position getPosition() { return position; } - + + public List> getItems() { + return items; + } + public enum ReturnLevel { - NONE(false), BREAK(false), CONTINUE(false), RETURN(true), FAIL(true); - + NONE(false), + BREAK(false), + CONTINUE(false), + RETURN(true), + FAIL(true); + private final boolean returnFast; - + ReturnLevel(boolean returnFast) { this.returnFast = returnFast; } - + public boolean isReturnFast() { return returnFast; } } - + + public static class ReturnInfo { private final ReturnLevel level; private final T data; - + public ReturnInfo(ReturnLevel level, T data) { this.level = level; this.data = data; } - + public ReturnLevel getLevel() { return level; } - + public T getData() { return data; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java index c648f6ea5..07721b1d3 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.terrascript.parser.lang; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public interface Item { T apply(ImplementationArguments implementationArguments, Map> variableMap); - + Position getPosition(); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java index fe38e8d89..a1f082985 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java @@ -2,16 +2,20 @@ package com.dfsek.terra.addons.terrascript.parser.lang; public interface Returnable extends Item { ReturnType returnType(); - + enum ReturnType { - NUMBER(true), STRING(true), BOOLEAN(false), VOID(false), OBJECT(false); - + NUMBER(true), + STRING(true), + BOOLEAN(false), + VOID(false), + OBJECT(false); + private final boolean comparable; - + ReturnType(boolean comparable) { this.comparable = comparable; } - + public boolean isComparable() { return comparable; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java index 0cde1207f..be22b5641 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java @@ -2,11 +2,12 @@ package com.dfsek.terra.addons.terrascript.parser.lang.constants; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class BooleanConstant extends ConstantExpression { public BooleanConstant(Boolean constant, Position position) { super(constant, position); } - + @Override public ReturnType returnType() { return ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java index da15d87b6..4b5a4ecad 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java @@ -1,31 +1,32 @@ package com.dfsek.terra.addons.terrascript.parser.lang.constants; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public abstract class ConstantExpression implements Returnable { private final T constant; private final Position position; - + public ConstantExpression(T constant, Position position) { this.constant = constant; this.position = position; } - + @Override public T apply(ImplementationArguments implementationArguments, Map> variableMap) { return constant; } - + @Override public Position getPosition() { return position; } - + public T getConstant() { return constant; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java index d82c3c280..568668671 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java @@ -3,11 +3,12 @@ package com.dfsek.terra.addons.terrascript.parser.lang.constants; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class NumericConstant extends ConstantExpression { public NumericConstant(Number constant, Position position) { super(constant, position); } - + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java index 83e397358..7e6bc04aa 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java @@ -3,11 +3,12 @@ package com.dfsek.terra.addons.terrascript.parser.lang.constants; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class StringConstant extends ConstantExpression { public StringConstant(String constant, Position position) { super(constant, position); } - + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.STRING; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java index 517fecfc4..852ae5ee6 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java @@ -1,11 +1,12 @@ package com.dfsek.terra.addons.terrascript.parser.lang.functions; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public interface Function extends Returnable { Function NULL = new Function() { @@ -13,12 +14,12 @@ public interface Function extends Returnable { public ReturnType returnType() { return null; } - + @Override public Object apply(ImplementationArguments implementationArguments, Map> variableMap) { return null; } - + @Override public Position getPosition() { return null; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java index d40c02d96..7c0fa41a8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java @@ -1,15 +1,16 @@ package com.dfsek.terra.addons.terrascript.parser.lang.functions; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; public interface FunctionBuilder> { T build(List> argumentList, Position position) throws ParseException; - + int argNumber(); - + Returnable.ReturnType getArgument(int position); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/def/FunctionBlock.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/def/FunctionBlock.java index 11fb44c8e..1e21175ab 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/def/FunctionBlock.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/def/FunctionBlock.java @@ -1,30 +1,27 @@ package com.dfsek.terra.addons.terrascript.parser.lang.functions.def; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Item; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.HashMap; -import java.util.List; -import java.util.Map; public class FunctionBlock implements Item { private final List> items; private final Position position; private final T defaultVal; - + public FunctionBlock(List> items, T defaultVal, Position position) { this.items = items; this.position = position; this.defaultVal = defaultVal; } - - public List> getItems() { - return items; - } - + @SuppressWarnings("unchecked") @Override public synchronized T apply(ImplementationArguments implementationArguments, Map> variableMap) { @@ -38,9 +35,13 @@ public class FunctionBlock implements Item { } return defaultVal; } - + @Override public Position getPosition() { return position; } + + public List> getItems() { + return items; + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java index efc225687..fe44e8d20 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java @@ -1,30 +1,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class BreakKeyword implements Keyword> { private final Position position; - + public BreakKeyword(Position position) { this.position = position; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { return new Block.ReturnInfo<>(Block.ReturnLevel.BREAK, null); } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java index 5cb3c859b..352529f61 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java @@ -1,30 +1,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class ContinueKeyword implements Keyword> { private final Position position; - + public ContinueKeyword(Position position) { this.position = position; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { return new Block.ReturnInfo<>(Block.ReturnLevel.CONTINUE, null); } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java index 4c0befe8c..2d0ea7247 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java @@ -1,30 +1,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class FailKeyword implements Keyword> { private final Position position; - + public FailKeyword(Position position) { this.position = position; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { return new Block.ReturnInfo<>(Block.ReturnLevel.FAIL, null); } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java index f7bf324eb..2130fc1e9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java @@ -1,30 +1,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class ReturnKeyword implements Keyword> { private final Position position; - + public ReturnKeyword(Position position) { this.position = position; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { return new Block.ReturnInfo<>(Block.ReturnLevel.RETURN, null); } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java index af245523f..045431df7 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Item; @@ -8,7 +10,6 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class ForKeyword implements Keyword> { private final Block conditional; @@ -16,7 +17,7 @@ public class ForKeyword implements Keyword> { private final Returnable statement; private final Item incrementer; private final Position position; - + public ForKeyword(Block conditional, Item initializer, Returnable statement, Item incrementer, Position position) { this.conditional = conditional; this.initializer = initializer; @@ -24,22 +25,24 @@ public class ForKeyword implements Keyword> { this.incrementer = incrementer; this.position = position; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { - for(initializer.apply(implementationArguments, variableMap); statement.apply(implementationArguments, variableMap); incrementer.apply(implementationArguments, variableMap)) { + for(initializer.apply(implementationArguments, variableMap); + statement.apply(implementationArguments, variableMap); + incrementer.apply(implementationArguments, variableMap)) { Block.ReturnInfo level = conditional.apply(implementationArguments, variableMap); if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; if(level.getLevel().isReturnFast()) return level; } return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java index ef863012b..bd6a5549d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java @@ -1,15 +1,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.Map; public class IfKeyword implements Keyword> { private final Block conditional; @@ -17,15 +19,16 @@ public class IfKeyword implements Keyword> { private final Position position; private final List, Block>> elseIf; private final Block elseBlock; - - public IfKeyword(Block conditional, Returnable statement, List, Block>> elseIf, @Nullable Block elseBlock, Position position) { + + public IfKeyword(Block conditional, Returnable statement, List, Block>> elseIf, + @Nullable Block elseBlock, Position position) { this.conditional = conditional; this.statement = statement; this.position = position; this.elseIf = elseIf; this.elseBlock = elseBlock; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { if(statement.apply(implementationArguments, variableMap)) return conditional.apply(implementationArguments, variableMap); @@ -39,31 +42,31 @@ public class IfKeyword implements Keyword> { } return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } - - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; } - + + public static class Pair { private final L left; private final R right; - + public Pair(L left, R right) { this.left = left; this.right = right; } - + public L getLeft() { return left; } - + public R getRight() { return right; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java index 52c53d454..49457f5b9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; @@ -7,19 +9,18 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class WhileKeyword implements Keyword> { private final Block conditional; private final Returnable statement; private final Position position; - + public WhileKeyword(Block conditional, Returnable statement, Position position) { this.conditional = conditional; this.statement = statement; this.position = position; } - + @Override public Block.ReturnInfo apply(ImplementationArguments implementationArguments, Map> variableMap) { while(statement.apply(implementationArguments, variableMap)) { @@ -29,12 +30,12 @@ public class WhileKeyword implements Keyword> { } return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java index 0d9a517ab..aa9fa7707 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java @@ -1,32 +1,33 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public abstract class BinaryOperation implements Returnable { private final Returnable left; private final Returnable right; private final Position start; - + public BinaryOperation(Returnable left, Returnable right, Position start) { this.left = left; this.right = right; this.start = start; } - + public abstract O apply(I left, I right); - - @Override - public Position getPosition() { - return start; - } - + @Override public O apply(ImplementationArguments implementationArguments, Map> variableMap) { return apply(left.apply(implementationArguments, variableMap), right.apply(implementationArguments, variableMap)); } + + @Override + public Position getPosition() { + return start; + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java index 85e2bea9b..90380e7a2 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class BooleanAndOperation extends BinaryOperation { public BooleanAndOperation(Returnable left, Returnable right, Position start) { super(left, right, start); } - + @Override public Boolean apply(Boolean left, Boolean right) { return left && right; } - + @Override public ReturnType returnType() { return ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java index 62065d666..3b2ccea7f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class BooleanNotOperation extends UnaryOperation { public BooleanNotOperation(Returnable input, Position position) { super(input, position); } - + @Override public Boolean apply(Boolean input) { return !input; } - + @Override public ReturnType returnType() { return ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java index c80f616dc..5322a0708 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class BooleanOrOperation extends BinaryOperation { public BooleanOrOperation(Returnable left, Returnable right, Position start) { super(left, right, start); } - + @Override public Boolean apply(Boolean left, Boolean right) { return left || right; } - + @Override public ReturnType returnType() { return ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java index 68b22a946..46ad64a10 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class ConcatenationOperation extends BinaryOperation { public ConcatenationOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public String apply(Object left, Object right) { return left.toString() + right.toString(); } - + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.STRING; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java index da49c6d01..1610502dc 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class DivisionOperation extends BinaryOperation { public DivisionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Number apply(Number left, Number right) { return left.doubleValue() / right.doubleValue(); } - + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java index 7faed9467..549962922 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class ModuloOperation extends BinaryOperation { public ModuloOperation(Returnable left, Returnable right, Position start) { super(left, right, start); } - + @Override public Number apply(Number left, Number right) { return left.doubleValue() % right.doubleValue(); } - + @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java index 935f23a11..f3fef308b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class MultiplicationOperation extends BinaryOperation { public MultiplicationOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Number apply(Number left, Number right) { return left.doubleValue() * right.doubleValue(); } - + @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java index b73e3d164..640b53443 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class NegationOperation extends UnaryOperation { public NegationOperation(Returnable input, Position position) { super(input, position); } - + @Override public Number apply(Number input) { return -input.doubleValue(); } - + @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java index cb69d98c8..2b93c4da8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class NumberAdditionOperation extends BinaryOperation { public NumberAdditionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Number apply(Number left, Number right) { return left.doubleValue() + right.doubleValue(); } - + @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java index c1697f8cb..a81d70ad4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java @@ -3,16 +3,17 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class SubtractionOperation extends BinaryOperation { public SubtractionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Number apply(Number left, Number right) { return left.doubleValue() - right.doubleValue(); } - + @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java index 9872397d0..3fbb194d0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java @@ -1,28 +1,29 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public abstract class UnaryOperation implements Returnable { private final Returnable input; private final Position position; - + public UnaryOperation(Returnable input, Position position) { this.input = input; this.position = position; } - + public abstract T apply(T input); - + @Override public T apply(ImplementationArguments implementationArguments, Map> variableMap) { return apply(input.apply(implementationArguments, variableMap)); } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java index 17f462a01..68906e9c8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java @@ -1,27 +1,29 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements; +import net.jafama.FastMath; + import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import net.jafama.FastMath; + public class EqualsStatement extends BinaryOperation { private static final double EPSILON = 0.000000001D; - + public EqualsStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Boolean apply(Object left, Object right) { if(left instanceof Number && right instanceof Number) { return FastMath.abs(((Number) left).doubleValue() - ((Number) right).doubleValue()) <= EPSILON; } - + return left.equals(right); } - - + + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java index 59430b2c4..c26e423ee 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java @@ -4,17 +4,18 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class GreaterOrEqualsThanStatement extends BinaryOperation { public GreaterOrEqualsThanStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Boolean apply(Number left, Number right) { return left.doubleValue() >= right.doubleValue(); } - - + + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java index 2043bdf34..be21852b4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java @@ -4,17 +4,18 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class GreaterThanStatement extends BinaryOperation { public GreaterThanStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Boolean apply(Number left, Number right) { return left.doubleValue() > right.doubleValue(); } - - + + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java index e5fc297d9..d44c51b00 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java @@ -4,17 +4,18 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class LessThanOrEqualsStatement extends BinaryOperation { public LessThanOrEqualsStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Boolean apply(Number left, Number right) { return left.doubleValue() <= right.doubleValue(); } - - + + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java index 093e7e297..639b45017 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java @@ -4,17 +4,18 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class LessThanStatement extends BinaryOperation { public LessThanStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Boolean apply(Number left, Number right) { return left.doubleValue() < right.doubleValue(); } - - + + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java index 854a96f5a..8d39caf3e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java @@ -4,17 +4,18 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class NotEqualsStatement extends BinaryOperation { public NotEqualsStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } - + @Override public Boolean apply(Object left, Object right) { return !left.equals(right); } - - + + @Override public Returnable.ReturnType returnType() { return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Assignment.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Assignment.java index 952a413b6..32be67aa9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Assignment.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Assignment.java @@ -1,23 +1,24 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Item; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class Assignment implements Item { private final Returnable value; private final Position position; private final String identifier; - + public Assignment(Returnable value, String identifier, Position position) { this.value = value; this.identifier = identifier; this.position = position; } - + @SuppressWarnings("unchecked") @Override public synchronized T apply(ImplementationArguments implementationArguments, Map> variableMap) { @@ -25,7 +26,7 @@ public class Assignment implements Item { ((Variable) variableMap.get(identifier)).setValue(val); return val; } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java index 257e05855..9e124bd58 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java @@ -3,30 +3,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class BooleanVariable implements Variable { private final Position position; private Boolean value; - + public BooleanVariable(Boolean value, Position position) { this.value = value; this.position = position; } - + @Override public Boolean getValue() { return value; } - + @Override public void setValue(Boolean value) { this.value = value; } - + @Override public Returnable.ReturnType getType() { return Returnable.ReturnType.BOOLEAN; } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Declaration.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Declaration.java index 6830eb272..5ded38fdd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Declaration.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Declaration.java @@ -1,18 +1,19 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Item; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class Declaration implements Item { private final Position position; private final String identifier; private final Returnable value; private final Returnable.ReturnType type; - + public Declaration(Position position, String identifier, Returnable value, Returnable.ReturnType type) { switch(type) { case STRING: @@ -27,7 +28,7 @@ public class Declaration implements Item { this.value = value; this.type = type; } - + @Override public T apply(ImplementationArguments implementationArguments, Map> variableMap) { T result = value.apply(implementationArguments, variableMap); @@ -44,16 +45,16 @@ public class Declaration implements Item { } return result; } - + @Override public Position getPosition() { return position; } - + public Returnable.ReturnType getType() { return type; } - + public String getIdentifier() { return identifier; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Getter.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Getter.java index 197ac6afa..c13fe536d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Getter.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Getter.java @@ -1,32 +1,33 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class Getter implements Returnable { private final String identifier; private final Position position; private final ReturnType type; - + public Getter(String identifier, Position position, ReturnType type) { this.identifier = identifier; this.position = position; this.type = type; } - + @Override public ReturnType returnType() { return type; } - + @Override public synchronized Object apply(ImplementationArguments implementationArguments, Map> variableMap) { return variableMap.get(identifier).getValue(); } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java index 40453cbfe..803e59a81 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java @@ -3,30 +3,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class NumberVariable implements Variable { private final Position position; private Number value; - + public NumberVariable(Number value, Position position) { this.value = value; this.position = position; } - + @Override public Number getValue() { return value; } - + @Override public void setValue(Number value) { this.value = value; } - + @Override public Returnable.ReturnType getType() { return Returnable.ReturnType.NUMBER; } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java index 01abb4dcc..a4b104458 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java @@ -3,30 +3,31 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class StringVariable implements Variable { private final Position position; private String value; - + public StringVariable(String value, Position position) { this.value = value; this.position = position; } - + @Override public String getValue() { return value; } - + @Override public void setValue(String value) { this.value = value; } - + @Override public Returnable.ReturnType getType() { return Returnable.ReturnType.STRING; } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java index e39e5289f..cc4beb9de 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java @@ -3,12 +3,13 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public interface Variable { T getValue(); - + void setValue(T value); - + Returnable.ReturnType getType(); - + Position getPosition(); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java index 4688b74f4..ee44b457f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java @@ -1,5 +1,16 @@ package com.dfsek.terra.addons.terrascript.script; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import net.jafama.FastMath; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.Random; +import java.util.concurrent.ExecutionException; + import com.dfsek.terra.addons.terrascript.buffer.DirectBuffer; import com.dfsek.terra.addons.terrascript.buffer.StructureBuffer; import com.dfsek.terra.addons.terrascript.parser.Parser; @@ -35,16 +46,7 @@ import com.dfsek.terra.api.structure.rotation.Rotation; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.World; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import net.jafama.FastMath; -import org.apache.commons.io.IOUtils; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.util.Random; -import java.util.concurrent.ExecutionException; public class StructureScript implements Structure { private final Block block; @@ -52,17 +54,18 @@ public class StructureScript implements Structure { private final Cache cache; private final TerraPlugin main; private String tempID; - - public StructureScript(InputStream inputStream, TerraPlugin main, Registry registry, Registry lootRegistry, Registry> functionRegistry) throws ParseException { + + public StructureScript(InputStream inputStream, TerraPlugin main, Registry registry, Registry lootRegistry, + Registry> functionRegistry) throws ParseException { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream, Charset.defaultCharset())); } catch(IOException e) { throw new RuntimeException(e); } - + functionRegistry.forEach(parser::registerFunction); // Register registry functions. - + parser .registerFunction("block", new BlockFunctionBuilder(main)) .registerFunction("debugBlock", new BlockFunctionBuilder(main)) @@ -79,14 +82,21 @@ public class StructureScript implements Structure { .registerFunction("getBlock", new CheckBlockFunctionBuilder()) .registerFunction("state", new StateFunctionBuilder(main)) .registerFunction("setWaterlog", new UnaryBooleanFunctionBuilder((waterlog, args) -> args.setWaterlog(waterlog))) - .registerFunction("originX", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getX(), Returnable.ReturnType.NUMBER)) - .registerFunction("originY", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getY(), Returnable.ReturnType.NUMBER)) - .registerFunction("originZ", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getZ(), Returnable.ReturnType.NUMBER)) - .registerFunction("rotation", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().toString(), Returnable.ReturnType.STRING)) - .registerFunction("rotationDegrees", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().getDegrees(), Returnable.ReturnType.NUMBER)) - .registerFunction("print", new UnaryStringFunctionBuilder(string -> main.getDebugLogger().info("[" + tempID + "] " + string))) + .registerFunction("originX", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getX(), + Returnable.ReturnType.NUMBER)) + .registerFunction("originY", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getY(), + Returnable.ReturnType.NUMBER)) + .registerFunction("originZ", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getZ(), + Returnable.ReturnType.NUMBER)) + .registerFunction("rotation", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().toString(), + Returnable.ReturnType.STRING)) + .registerFunction("rotationDegrees", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().getDegrees(), + Returnable.ReturnType.NUMBER)) + .registerFunction("print", + new UnaryStringFunctionBuilder(string -> main.getDebugLogger().info("[" + tempID + "] " + string))) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) - .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) + .registerFunction("pow", new BinaryNumberFunctionBuilder( + (number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue()))) .registerFunction("floor", new UnaryNumberFunctionBuilder(number -> FastMath.floor(number.doubleValue()))) .registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> FastMath.ceil(number.doubleValue()))) @@ -98,20 +108,22 @@ public class StructureScript implements Structure { .registerFunction("asin", new UnaryNumberFunctionBuilder(number -> FastMath.asin(number.doubleValue()))) .registerFunction("acos", new UnaryNumberFunctionBuilder(number -> FastMath.acos(number.doubleValue()))) .registerFunction("atan", new UnaryNumberFunctionBuilder(number -> FastMath.atan(number.doubleValue()))) - .registerFunction("max", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue()))) - .registerFunction("min", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue()))); - + .registerFunction("max", new BinaryNumberFunctionBuilder( + (number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue()))) + .registerFunction("min", new BinaryNumberFunctionBuilder( + (number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue()))); + if(!main.getTerraConfig().isDebugScript()) { parser.ignoreFunction("debugBlock"); } - + block = parser.parse(); this.id = parser.getID(); tempID = id; this.main = main; this.cache = CacheBuilder.newBuilder().maximumSize(main.getTerraConfig().getStructureCache()).build(); } - + @Override @SuppressWarnings("try") public boolean generate(Vector3 location, World world, Chunk chunk, Random random, Rotation rotation) { @@ -121,7 +133,24 @@ public class StructureScript implements Structure { return buffer.succeeded(); } } - + + @Override + @SuppressWarnings("try") + public boolean generate(Buffer buffer, World world, Random random, Rotation rotation, int recursions) { + try(ProfileFrame ignore = main.getProfiler().profile("terrascript_recursive:" + id)) { + return applyBlock(new TerraImplementationArguments(buffer, rotation, random, world, recursions)); + } + } + + @Override + @SuppressWarnings("try") + public boolean generate(Vector3 location, World world, Random random, Rotation rotation) { + try(ProfileFrame ignore = main.getProfiler().profile("terrascript_direct:" + id)) { + DirectBuffer buffer = new DirectBuffer(location, world); + return applyBlock(new TerraImplementationArguments(buffer, rotation, random, world, 0)); + } + } + @SuppressWarnings("try") public boolean test(Vector3 location, World world, Random random, Rotation rotation) { try(ProfileFrame ignore = main.getProfiler().profile("terrascript_test:" + id)) { @@ -129,7 +158,7 @@ public class StructureScript implements Structure { return buffer.succeeded(); } } - + private StructureBuffer computeBuffer(Vector3 location, World world, Random random, Rotation rotation) { try { return cache.get(location, () -> { @@ -141,29 +170,7 @@ public class StructureScript implements Structure { throw new RuntimeException(e); } } - - @Override - @SuppressWarnings("try") - public boolean generate(Buffer buffer, World world, Random random, Rotation rotation, int recursions) { - try(ProfileFrame ignore = main.getProfiler().profile("terrascript_recursive:" + id)) { - return applyBlock(new TerraImplementationArguments(buffer, rotation, random, world, recursions)); - } - } - - @Override - @SuppressWarnings("try") - public boolean generate(Vector3 location, World world, Random random, Rotation rotation) { - try(ProfileFrame ignore = main.getProfiler().profile("terrascript_direct:" + id)) { - DirectBuffer buffer = new DirectBuffer(location, world); - return applyBlock(new TerraImplementationArguments(buffer, rotation, random, world, 0)); - } - } - - @Override - public String getID() { - return id; - } - + private boolean applyBlock(TerraImplementationArguments arguments) { try { return block.apply(arguments).getLevel() != Block.ReturnLevel.FAIL; @@ -173,4 +180,9 @@ public class StructureScript implements Structure { return false; } } + + @Override + public String getID() { + return id; + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java index 4bb0dac53..15772fcea 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java @@ -1,11 +1,12 @@ package com.dfsek.terra.addons.terrascript.script; +import java.util.Random; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structure.buffer.Buffer; import com.dfsek.terra.api.structure.rotation.Rotation; import com.dfsek.terra.api.world.World; -import java.util.Random; public class TerraImplementationArguments implements ImplementationArguments { private final Buffer buffer; @@ -14,7 +15,7 @@ public class TerraImplementationArguments implements ImplementationArguments { private final World world; private final int recursions; private boolean waterlog = false; - + public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, World world, int recursions) { this.buffer = buffer; this.rotation = rotation; @@ -22,31 +23,31 @@ public class TerraImplementationArguments implements ImplementationArguments { this.world = world; this.recursions = recursions; } - + public Buffer getBuffer() { return buffer; } - + public int getRecursions() { return recursions; } - + public Random getRandom() { return random; } - + public Rotation getRotation() { return rotation; } - + public boolean isWaterlog() { return waterlog; } - + public void setWaterlog(boolean waterlog) { this.waterlog = waterlog; } - + public World getWorld() { return world; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java index 3f6ae1bc5..f25a4a32f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -7,18 +11,15 @@ import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; public class BinaryNumberFunctionBuilder implements FunctionBuilder> { - + private final BiFunction function; - + public BinaryNumberFunctionBuilder(BiFunction function) { this.function = function; } - + @Override public Function build(List> argumentList, Position position) { return new Function() { @@ -26,25 +27,26 @@ public class BinaryNumberFunctionBuilder implements FunctionBuilder> variableMap) { - return function.apply(((Returnable) argumentList.get(0)).apply(implementationArguments, variableMap), ((Returnable) argumentList.get(1)).apply(implementationArguments, variableMap)); + return function.apply(((Returnable) argumentList.get(0)).apply(implementationArguments, variableMap), + ((Returnable) argumentList.get(1)).apply(implementationArguments, variableMap)); } - + @Override public Position getPosition() { return position; } }; } - + @Override public int argNumber() { return 2; } - + @Override public Returnable.ReturnType getArgument(int position) { if(position == 0 || position == 1) return Returnable.ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java index 5352c7040..e340a2d9d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java @@ -1,31 +1,33 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.BiomeFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; -import java.util.List; public class BiomeFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - + public BiomeFunctionBuilder(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("unchecked") @Override public BiomeFunction build(List> argumentList, Position position) { - return new BiomeFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + return new BiomeFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), position); } - + @Override public int argNumber() { return 3; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java index 1667b4bf5..f5e957499 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant; @@ -9,15 +11,14 @@ import com.dfsek.terra.addons.terrascript.script.functions.BlockFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; -import java.util.List; public class BlockFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - + public BlockFunctionBuilder(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("unchecked") @Override public BlockFunction build(List> argumentList, Position position) throws ParseException { @@ -25,16 +26,20 @@ public class BlockFunctionBuilder implements FunctionBuilder { Returnable booleanReturnable = new BooleanConstant(true, position); if(argumentList.size() == 5) booleanReturnable = (Returnable) argumentList.get(4); if(argumentList.get(3) instanceof StringConstant) { - return new BlockFunction.Constant((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (StringConstant) argumentList.get(3), booleanReturnable, main, position); + return new BlockFunction.Constant((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (StringConstant) argumentList.get(3), + booleanReturnable, main, position); } - return new BlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), booleanReturnable, main, position); + return new BlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), booleanReturnable, + main, position); } - + @Override public int argNumber() { return -1; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java index bd737eb39..141372ef6 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java @@ -1,24 +1,26 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.CheckBlockFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; public class CheckBlockFunctionBuilder implements FunctionBuilder { @SuppressWarnings("unchecked") @Override public CheckBlockFunction build(List> argumentList, Position position) { - return new CheckBlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + return new CheckBlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), position); } - + @Override public int argNumber() { return 3; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckFunctionBuilder.java index 5d058b679..e94febc9e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckFunctionBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; @@ -7,26 +9,26 @@ import com.dfsek.terra.addons.terrascript.script.functions.CheckFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; -import java.util.List; public class CheckFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - + public CheckFunctionBuilder(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("unchecked") @Override public CheckFunction build(List> argumentList, Position position) throws ParseException { - return new CheckFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + return new CheckFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), position); } - + @Override public int argNumber() { return 3; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java index 3fc8200a0..c65b000d2 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; @@ -7,26 +9,26 @@ import com.dfsek.terra.addons.terrascript.script.functions.EntityFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; -import java.util.List; public class EntityFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - + public EntityFunctionBuilder(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("unchecked") @Override public EntityFunction build(List> argumentList, Position position) throws ParseException { - return new EntityFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + return new EntityFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); } - + @Override public int argNumber() { return 4; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java index c636d44f4..aa1674cc0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java @@ -1,28 +1,30 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.GetMarkFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; public class GetMarkFunctionBuilder implements FunctionBuilder { - + public GetMarkFunctionBuilder() { } - + @SuppressWarnings("unchecked") @Override public GetMarkFunction build(List> argumentList, Position position) { - return new GetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + return new GetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), position); } - + @Override public int argNumber() { return 3; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java index 6a9a1e1fe..dd4e2d9b5 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.StructureScript; @@ -9,30 +11,30 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.LootTable; -import java.util.List; public class LootFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; private final Registry registry; private final StructureScript script; - + public LootFunctionBuilder(TerraPlugin main, Registry registry, StructureScript script) { this.main = main; this.registry = registry; this.script = script; } - + @SuppressWarnings("unchecked") @Override public LootFunction build(List> argumentList, Position position) { - return new LootFunction(registry, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position, script); + return new LootFunction(registry, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position, script); } - + @Override public int argNumber() { return 4; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java index e68514ade..520c5d083 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; @@ -7,26 +9,26 @@ import com.dfsek.terra.addons.terrascript.script.functions.PullFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; -import java.util.List; public class PullFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - + public PullFunctionBuilder(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("unchecked") @Override public PullFunction build(List> argumentList, Position position) throws ParseException { - return new PullFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + return new PullFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); } - + @Override public int argNumber() { return 4; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java index ab816c94a..a001051ce 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.RandomFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; public class RandomFunctionBuilder implements FunctionBuilder { @SuppressWarnings("unchecked") @@ -14,12 +15,12 @@ public class RandomFunctionBuilder implements FunctionBuilder { public RandomFunction build(List> argumentList, Position position) throws ParseException { return new RandomFunction((Returnable) argumentList.get(0), position); } - + @Override public int argNumber() { return 1; } - + @Override public Returnable.ReturnType getArgument(int position) { if(position == 0) return Returnable.ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java index be812d3a3..8fe2815ca 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java @@ -1,24 +1,25 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.RecursionsFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; public class RecursionsFunctionBuilder implements FunctionBuilder { @Override public RecursionsFunction build(List> argumentList, Position position) throws ParseException { return new RecursionsFunction(position); } - + @Override public int argNumber() { return 0; } - + @Override public Returnable.ReturnType getArgument(int position) { return null; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java index 8c06c017e..920cdfdc8 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java @@ -1,29 +1,31 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.functions.SetMarkFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; public class SetMarkFunctionBuilder implements FunctionBuilder { - + public SetMarkFunctionBuilder() { } - + @SuppressWarnings("unchecked") @Override public SetMarkFunction build(List> argumentList, Position position) throws ParseException { - return new SetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), position); + return new SetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), position); } - + @Override public int argNumber() { return 4; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java index b55deb282..e551f249e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; @@ -7,27 +9,27 @@ import com.dfsek.terra.addons.terrascript.script.functions.StateFunction; import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.TerraPlugin; -import java.util.List; public class StateFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - + public StateFunctionBuilder(TerraPlugin main) { this.main = main; } - + @SuppressWarnings("unchecked") @Override public StateFunction build(List> argumentList, Position position) throws ParseException { if(argumentList.size() < 4) throw new ParseException("Expected data", position); - return new StateFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + return new StateFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); } - + @Override public int argNumber() { return 4; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java index 5f993e334..f695c7351 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; +import java.util.stream.Collectors; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; @@ -9,32 +12,32 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.Structure; -import java.util.List; -import java.util.stream.Collectors; public class StructureFunctionBuilder implements FunctionBuilder { private final Registry registry; private final TerraPlugin main; - + public StructureFunctionBuilder(Registry registry, TerraPlugin main) { this.registry = registry; this.main = main; } - + @SuppressWarnings("unchecked") @Override public StructureFunction build(List> argumentList, Position position) throws ParseException { if(argumentList.size() < 5) throw new ParseException("Expected rotations", position); - - return new StructureFunction((Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), - argumentList.stream().map(item -> ((Returnable) item)).collect(Collectors.toList()), registry, position, main); + + return new StructureFunction((Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), + (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), + argumentList.stream().map(item -> ((Returnable) item)).collect(Collectors.toList()), registry, + position, main); } - + @Override public int argNumber() { return -1; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java index e38678a47..16da09601 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -8,18 +12,15 @@ import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; public class UnaryBooleanFunctionBuilder implements FunctionBuilder> { - + private final BiConsumer function; - + public UnaryBooleanFunctionBuilder(BiConsumer function) { this.function = function; } - + @Override public Function build(List> argumentList, Position position) { return new Function() { @@ -27,26 +28,27 @@ public class UnaryBooleanFunctionBuilder implements FunctionBuilder> variableMap) { - function.accept(((Returnable) argumentList.get(0)).apply(implementationArguments, variableMap), (TerraImplementationArguments) implementationArguments); + function.accept(((Returnable) argumentList.get(0)).apply(implementationArguments, variableMap), + (TerraImplementationArguments) implementationArguments); return null; } - + @Override public Position getPosition() { return position; } }; } - + @Override public int argNumber() { return 1; } - + @Override public Returnable.ReturnType getArgument(int position) { if(position == 0) return Returnable.ReturnType.BOOLEAN; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java index 168507661..e28512b30 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -7,17 +10,15 @@ import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; -import java.util.Map; public class UnaryNumberFunctionBuilder implements FunctionBuilder> { - + private final java.util.function.Function function; - + public UnaryNumberFunctionBuilder(java.util.function.Function function) { this.function = function; } - + @Override public Function build(List> argumentList, Position position) { return new Function() { @@ -25,25 +26,25 @@ public class UnaryNumberFunctionBuilder implements FunctionBuilder> variableMap) { return function.apply(((Returnable) argumentList.get(0)).apply(implementationArguments, variableMap)); } - + @Override public Position getPosition() { return position; } }; } - + @Override public int argNumber() { return 1; } - + @Override public Returnable.ReturnType getArgument(int position) { if(position == 0) return Returnable.ReturnType.NUMBER; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java index 846dfc774..4989cdabe 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -7,17 +10,15 @@ import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; -import java.util.Map; public class UnaryStringFunctionBuilder implements FunctionBuilder> { - + private final java.util.function.Consumer function; - + public UnaryStringFunctionBuilder(java.util.function.Consumer function) { this.function = function; } - + @Override public Function build(List> argumentList, Position position) { return new Function() { @@ -25,26 +26,26 @@ public class UnaryStringFunctionBuilder implements FunctionBuilder> variableMap) { function.accept(((Returnable) argumentList.get(0)).apply(implementationArguments, variableMap)); return null; } - + @Override public Position getPosition() { return position; } }; } - + @Override public int argNumber() { return 1; } - + @Override public Returnable.ReturnType getArgument(int position) { if(position == 0) return Returnable.ReturnType.STRING; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java index 9c1a84b34..05bfecfcd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java @@ -1,5 +1,8 @@ package com.dfsek.terra.addons.terrascript.script.builders; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -8,18 +11,16 @@ import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.List; -import java.util.Map; public class ZeroArgFunctionBuilder implements FunctionBuilder> { private final java.util.function.Function function; private final Returnable.ReturnType type; - + public ZeroArgFunctionBuilder(java.util.function.Function function, Returnable.ReturnType type) { this.function = function; this.type = type; } - + @Override public Function build(List> argumentList, Position position) { return new Function() { @@ -27,24 +28,24 @@ public class ZeroArgFunctionBuilder implements FunctionBuilder> { public ReturnType returnType() { return type; } - + @Override public T apply(ImplementationArguments implementationArguments, Map> variableMap) { return function.apply((TerraImplementationArguments) implementationArguments); } - + @Override public Position getPosition() { return position; } }; } - + @Override public int argNumber() { return 0; } - + @Override public Returnable.ReturnType getArgument(int position) { if(position == 0) return type; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java index 819477d5d..a550c3210 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -11,16 +15,14 @@ import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import net.jafama.FastMath; -import java.util.Map; public class BiomeFunction implements Function { private final TerraPlugin main; private final Returnable x, y, z; private final Position position; - - + + public BiomeFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { this.main = main; this.x = x; @@ -28,27 +30,32 @@ public class BiomeFunction implements Function { this.z = z; this.position = position; } - - + + @Override public String apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - + BiomeProvider grid = arguments.getWorld().getBiomeProvider(); - - return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))), arguments.getWorld().getSeed()).getID(); + + return grid.getBiome(arguments.getBuffer() + .getOrigin() + .clone() + .add(new Vector3(FastMath.roundToInt(xz.getX()), + y.apply(implementationArguments, variableMap).intValue(), + FastMath.roundToInt(xz.getZ()))), arguments.getWorld().getSeed()).getID(); } - - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.STRING; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index 2bc479789..46cfbb2ab 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -1,5 +1,10 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.HashMap; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.buffer.items.BufferedBlock; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -13,21 +18,18 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.HashMap; -import java.util.Map; public class BlockFunction implements Function { protected final Returnable x, y, z; - - private final Map data = new HashMap<>(); protected final Returnable blockData; protected final TerraPlugin main; + private final Map data = new HashMap<>(); private final Returnable overwrite; private final Position position; - - public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable blockData, Returnable overwrite, TerraPlugin main, Position position) { + + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable blockData, + Returnable overwrite, TerraPlugin main, Position position) { this.x = x; this.y = y; this.z = z; @@ -36,16 +38,7 @@ public class BlockFunction implements Function { this.main = main; this.position = position; } - - void setBlock(ImplementationArguments implementationArguments, Map> variableMap, TerraImplementationArguments arguments, BlockState rot) { - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - - RotationUtil.rotateVector(xz, arguments.getRotation()); - - RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); - arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()))); - } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; @@ -53,28 +46,45 @@ public class BlockFunction implements Function { setBlock(implementationArguments, variableMap, arguments, rot); return null; } - - protected BlockState getBlockState(ImplementationArguments arguments, Map> variableMap) { - return data.computeIfAbsent(blockData.apply(arguments, variableMap), main.getWorldHandle()::createBlockData); - } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; } - + + void setBlock(ImplementationArguments implementationArguments, Map> variableMap, + TerraImplementationArguments arguments, BlockState rot) { + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + + RotationUtil.rotateVector(xz, arguments.getRotation()); + + RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); + arguments.getBuffer().addItem( + new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), + new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), + FastMath.roundToInt(xz.getZ()))); + } + + protected BlockState getBlockState(ImplementationArguments arguments, Map> variableMap) { + return data.computeIfAbsent(blockData.apply(arguments, variableMap), main.getWorldHandle()::createBlockData); + } + + public static class Constant extends BlockFunction { private final BlockState state; - public Constant(Returnable x, Returnable y, Returnable z, StringConstant blockData, Returnable overwrite, TerraPlugin main, Position position) { + + public Constant(Returnable x, Returnable y, Returnable z, StringConstant blockData, + Returnable overwrite, TerraPlugin main, Position position) { super(x, y, z, blockData, overwrite, main, position); this.state = main.getWorldHandle().createBlockData(blockData.getConstant()); } - + @Override protected BlockState getBlockState(ImplementationArguments arguments, Map> variableMap) { return state; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java index ce40a7284..ea3901a47 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -9,41 +13,46 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.Map; public class CheckBlockFunction implements Function { private final Returnable x, y, z; private final Position position; - + public CheckBlockFunction(Returnable x, Returnable y, Returnable z, Position position) { this.x = x; this.y = y; this.z = z; this.position = position; } - - + + @Override public String apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - - String data = arguments.getWorld().getBlockData(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())))).getAsString(); + + String data = arguments.getWorld() + .getBlockData(arguments.getBuffer() + .getOrigin() + .clone() + .add(new Vector3(FastMath.roundToInt(xz.getX()), + y.apply(implementationArguments, variableMap) + .doubleValue(), FastMath.roundToInt(xz.getZ())))) + .getAsString(); if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties else return data; } - - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.STRING; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckFunction.java index ea0fe9af5..127a2854a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -12,15 +16,13 @@ import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.generator.SamplerCache; -import net.jafama.FastMath; -import java.util.Map; public class CheckFunction implements Function { private final TerraPlugin main; private final Returnable x, y, z; private final Position position; - + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { this.main = main; this.x = x; @@ -28,52 +30,56 @@ public class CheckFunction implements Function { this.z = z; this.position = position; } - - + + @Override public String apply(ImplementationArguments implementationArguments, Map> variableMap) { - - + + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - - - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + + + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - - Vector3 location = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()))); - + + Vector3 location = arguments.getBuffer().getOrigin().clone().add( + new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), + FastMath.roundToInt(xz.getZ()))); + return apply(location, arguments.getWorld()); } - + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } + private String apply(Vector3 vector, World world) { int y = vector.getBlockY(); if(y >= world.getMaxHeight() || y < 0) return "AIR"; SamplerCache cache = world.getConfig().getSamplerCache(); double comp = sample(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ(), cache); - + if(comp > 0) return "LAND"; // If noise val is greater than zero, location will always be land. - + //BiomeProvider provider = tw.getBiomeProvider(); //TerraBiome b = provider.getBiome(vector.getBlockX(), vector.getBlockZ()); - - /*if(vector.getY() > c.getSeaLevel())*/ return "AIR"; // Above sea level + + /*if(vector.getY() > c.getSeaLevel())*/ + return "AIR"; // Above sea level //return "OCEAN"; // Below sea level } - + private double sample(int x, int y, int z, SamplerCache cache) { int cx = FastMath.floorDiv(x, 16); int cz = FastMath.floorDiv(z, 16); return cache.get(x, z).sample(x - (cx << 4), y, z - (cz << 4)); } - - @Override - public Position getPosition() { - return position; - } - - @Override - public ReturnType returnType() { - return ReturnType.STRING; - } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java index 1bd03c399..4b516afbe 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.buffer.items.BufferedEntity; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; @@ -15,41 +17,43 @@ import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import java.util.Map; public class EntityFunction implements Function { private final EntityType data; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; - - public EntityFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { + + public EntityFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, + Position position) throws ParseException { this.position = position; this.main = main; if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition()); - + this.data = main.getWorldHandle().getEntity(((ConstantExpression) data).getConstant()); this.x = x; this.y = y; this.z = z; } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - - arguments.getBuffer().addItem(new BufferedEntity(data, main), new Vector3(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ())); + + arguments.getBuffer().addItem(new BufferedEntity(data, main), + new Vector3(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ())); return null; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java index ad2a0c659..09c55002f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -9,36 +13,36 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.Map; public class GetMarkFunction implements Function { private final Returnable x, y, z; private final Position position; - + public GetMarkFunction(Returnable x, Returnable y, Returnable z, Position position) { this.position = position; this.x = x; this.y = y; this.z = z; } - + @Override public String apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - String mark = arguments.getBuffer().getMark(new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ()))); + String mark = arguments.getBuffer().getMark(new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt( + y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ()))); return mark == null ? "" : mark; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.STRING; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 04d0e83ef..02b230c80 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.buffer.items.BufferedLootApplication; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -14,9 +18,7 @@ import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.Map; public class LootFunction implements Function { private final Registry registry; @@ -25,8 +27,9 @@ public class LootFunction implements Function { private final Position position; private final TerraPlugin main; private final StructureScript script; - - public LootFunction(Registry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { + + public LootFunction(Registry registry, Returnable x, Returnable y, Returnable z, + Returnable data, TerraPlugin main, Position position, StructureScript script) { this.registry = registry; this.position = position; this.data = data; @@ -36,31 +39,34 @@ public class LootFunction implements Function { this.main = main; this.script = script; } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - + String id = data.apply(implementationArguments, variableMap); LootTable table = registry.get(id); - + if(table == null) { main.logger().severe("No such loot table " + id); return null; } - - arguments.getBuffer().addItem(new BufferedLootApplication(table, main, script), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))); + + arguments.getBuffer().addItem(new BufferedLootApplication(table, main, script), + new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), + FastMath.roundToInt(xz.getZ()))); return null; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index c56af421a..1ed53f48b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.buffer.items.BufferedPulledBlock; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; @@ -14,42 +18,44 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.Map; public class PullFunction implements Function { private final BlockState data; private final Returnable x, y, z; private final Position position; - - public PullFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { + + public PullFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, + Position position) throws ParseException { this.position = position; if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); - + this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); this.x = x; this.y = y; this.z = z; } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); BlockState rot = data.clone(); RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); - arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedPulledBlock(rot), + new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), + FastMath.roundToInt(xz.getZ()))); return null; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java index c7b51990a..6cec0dcca 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -7,28 +9,28 @@ import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class RandomFunction implements Function { private final Returnable numberReturnable; private final Position position; - + public RandomFunction(Returnable numberReturnable, Position position) { this.numberReturnable = numberReturnable; this.position = position; } - - + + @Override public ReturnType returnType() { return ReturnType.NUMBER; } - + @Override public Integer apply(ImplementationArguments implementationArguments, Map> variableMap) { - return ((TerraImplementationArguments) implementationArguments).getRandom().nextInt(numberReturnable.apply(implementationArguments, variableMap).intValue()); + return ((TerraImplementationArguments) implementationArguments).getRandom().nextInt( + numberReturnable.apply(implementationArguments, variableMap).intValue()); } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java index dcbfdbee7..0d4ce39d4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java @@ -1,30 +1,31 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import java.util.Map; public class RecursionsFunction implements Function { private final Position position; - + public RecursionsFunction(Position position) { this.position = position; } - + @Override public ReturnType returnType() { return ReturnType.NUMBER; } - + @Override public Number apply(ImplementationArguments implementationArguments, Map> variableMap) { return ((TerraImplementationArguments) implementationArguments).getRecursions(); } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java index 506078c2e..9ff19038c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; @@ -9,15 +13,13 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.Map; public class SetMarkFunction implements Function { private final Returnable x, y, z; private final Position position; private final Returnable mark; - + public SetMarkFunction(Returnable x, Returnable y, Returnable z, Returnable mark, Position position) { this.position = position; this.mark = mark; @@ -25,23 +27,29 @@ public class SetMarkFunction implements Function { this.y = y; this.z = z; } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - - arguments.getBuffer().setMark(mark.apply(implementationArguments, variableMap), new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ()))); + + arguments.getBuffer().setMark(mark.apply(implementationArguments, variableMap), new Vector3(FastMath.floorToInt(xz.getX()), + FastMath.floorToInt( + y.apply(implementationArguments, + variableMap) + .doubleValue()), + FastMath.floorToInt(xz.getZ()))); return null; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java index bec4e7e8c..53c53dd71 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java @@ -1,5 +1,9 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.Map; + import com.dfsek.terra.addons.terrascript.buffer.items.BufferedStateManipulator; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -11,17 +15,16 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.Map; public class StateFunction implements Function { private final Returnable data; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; - - public StateFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + + public StateFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, + Position position) { this.position = position; this.main = main; this.data = data; @@ -29,22 +32,25 @@ public class StateFunction implements Function { this.y = y; this.z = z; } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); RotationUtil.rotateVector(xz, arguments.getRotation()); - - arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments, variableMap)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))); + + arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments, variableMap)), + new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), + FastMath.roundToInt(xz.getZ()))); return null; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index b0537906f..d11083507 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -1,5 +1,10 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import net.jafama.FastMath; + +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.buffer.IntermediateBuffer; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -14,10 +19,7 @@ import com.dfsek.terra.api.structure.rotation.Rotation; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector3; -import net.jafama.FastMath; -import java.util.List; -import java.util.Map; public class StructureFunction implements Function { private final Registry registry; @@ -26,8 +28,9 @@ public class StructureFunction implements Function { private final Position position; private final TerraPlugin main; private final List> rotations; - - public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, Registry registry, Position position, TerraPlugin main) { + + public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, + List> rotations, Registry registry, Position position, TerraPlugin main) { this.registry = registry; this.id = id; this.position = position; @@ -37,30 +40,31 @@ public class StructureFunction implements Function { this.main = main; this.rotations = rotations; } - + @Override public ReturnType returnType() { return ReturnType.BOOLEAN; } - + @Override public Boolean apply(ImplementationArguments implementationArguments, Map> variableMap) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - + if(arguments.getRecursions() > main.getTerraConfig().getMaxRecursion()) throw new RuntimeException("Structure recursion too deep: " + arguments.getRecursions()); - - Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); - + + Vector2 xz = new Vector2(x.apply(implementationArguments, variableMap).doubleValue(), + z.apply(implementationArguments, variableMap).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); - + String app = id.apply(implementationArguments, variableMap); Structure script = registry.get(app); if(script == null) { main.logger().severe("No such structure " + app); return null; } - + Rotation rotation1; String rotString = rotations.get(arguments.getRandom().nextInt(rotations.size())).apply(implementationArguments, variableMap); try { @@ -69,12 +73,14 @@ public class StructureFunction implements Function { main.logger().severe("Invalid rotation " + rotString); return null; } - - Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())); - - return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); + + Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), + FastMath.roundToInt(xz.getZ())); + + return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), + arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); } - + @Override public Position getPosition() { return position; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java index 682506740..7eb21418f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java @@ -4,38 +4,14 @@ public class Char { private final char character; private final int index; private final int line; - - + + public Char(char character, int index, int line) { this.character = character; this.index = index; this.line = line; } - - public char getCharacter() { - return character; - } - - public int getIndex() { - return index; - } - - public int getLine() { - return line; - } - - public boolean isWhitespace() { - return Character.isWhitespace(character); - } - - public boolean isNewLine() { - return character == '\n'; - } - - public boolean isDigit() { - return Character.isDigit(character); - } - + public boolean is(char... tests) { for(char test : tests) { if(test == character && test != '\0') { @@ -44,13 +20,37 @@ public class Char { } return false; } - - public boolean isEOF() { - return character == '\0'; - } - + @Override public String toString() { return Character.toString(character); } + + public char getCharacter() { + return character; + } + + public int getIndex() { + return index; + } + + public int getLine() { + return line; + } + + public boolean isWhitespace() { + return Character.isWhitespace(character); + } + + public boolean isNewLine() { + return character == '\n'; + } + + public boolean isDigit() { + return Character.isDigit(character); + } + + public boolean isEOF() { + return character == '\0'; + } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java index 633d2ab52..e65c6476f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java @@ -6,6 +6,7 @@ import java.io.Reader; import java.util.ArrayList; import java.util.List; + /** * Stream-like data structure that allows viewing future elements without consuming current. */ @@ -15,11 +16,11 @@ public class Lookahead { private int index = 0; private int line = 0; private boolean end = false; - + public Lookahead(Reader r) { this.input = r; } - + /** * Get the current character without consuming it. * @@ -28,8 +29,8 @@ public class Lookahead { public Char current() { return next(0); } - - + + /** * Consume and return one character. * @@ -40,7 +41,57 @@ public class Lookahead { consume(1); return consumed; } - + + /** + * Fetch a future character without consuming it. + * + * @param ahead Distance ahead to peek + * + * @return Character + */ + public Char next(int ahead) { + if(ahead < 0) throw new IllegalArgumentException(); + + while(buffer.size() <= ahead && !end) { + Char item = fetch(); + if(item != null) { + buffer.add(item); + } else end = true; + } + + if(ahead >= buffer.size()) { + return null; + } else return buffer.get(ahead); + } + + /** + * Consume an amount of characters + * + * @param amount Number of characters to consume + */ + public void consume(int amount) { + if(amount < 0) throw new IllegalArgumentException(); + while(amount-- > 0) { + if(!buffer.isEmpty()) buffer.remove(0); // Remove top item from buffer. + else { + if(end) return; + Char item = fetch(); + if(item == null) end = true; + } + } + } + + public boolean matches(String check, boolean consume) { + if(check == null) return false; + + for(int i = 0; i < check.length(); i++) { + if(!next(i).is(check.charAt(i))) return false; + } + + if(consume) consume(check.length()); // Consume string + return true; + } + /** * Fetch the next character. * @@ -61,61 +112,12 @@ public class Lookahead { return null; } } - - /** - * Fetch a future character without consuming it. - * - * @param ahead Distance ahead to peek - * @return Character - */ - public Char next(int ahead) { - if(ahead < 0) throw new IllegalArgumentException(); - - while(buffer.size() <= ahead && !end) { - Char item = fetch(); - if(item != null) { - buffer.add(item); - } else end = true; - } - - if(ahead >= buffer.size()) { - return null; - } else return buffer.get(ahead); - } - + public int getLine() { return line; } - + public int getIndex() { return index; } - - /** - * Consume an amount of characters - * - * @param amount Number of characters to consume - */ - public void consume(int amount) { - if(amount < 0) throw new IllegalArgumentException(); - while(amount-- > 0) { - if(!buffer.isEmpty()) buffer.remove(0); // Remove top item from buffer. - else { - if(end) return; - Char item = fetch(); - if(item == null) end = true; - } - } - } - - public boolean matches(String check, boolean consume) { - if(check == null) return false; - - for(int i = 0; i < check.length(); i++) { - if(!next(i).is(check.charAt(i))) return false; - } - - if(consume) consume(check.length()); // Consume string - return true; - } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java index 0a817a183..f57663c44 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java @@ -3,12 +3,12 @@ package com.dfsek.terra.addons.terrascript.tokenizer; public class Position { private final int line; private final int index; - + public Position(int line, int index) { this.line = line; this.index = index; } - + @Override public String toString() { return (line + 1) + ":" + index; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java index 6d69d556a..252e69aeb 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java @@ -4,88 +4,88 @@ public class Token { private final String content; private final Type type; private final Position start; - + public Token(String content, Type type, Position start) { this.content = content; this.type = type; this.start = start; } - - public Type getType() { - return type; - } - - public String getContent() { - return content; - } - - public Position getPosition() { - return start; - } - + @Override public String toString() { return type + ": '" + content + "'"; } - + + public Type getType() { + return type; + } + + public String getContent() { + return content; + } + + public Position getPosition() { + return start; + } + public boolean isConstant() { return this.type.equals(Type.NUMBER) || this.type.equals(Type.STRING) || this.type.equals(Type.BOOLEAN); } - + public boolean isBinaryOperator() { return type.equals(Type.ADDITION_OPERATOR) - || type.equals(Type.SUBTRACTION_OPERATOR) - || type.equals(Type.MULTIPLICATION_OPERATOR) - || type.equals(Type.DIVISION_OPERATOR) - || type.equals(Type.EQUALS_OPERATOR) - || type.equals(Type.NOT_EQUALS_OPERATOR) - || type.equals(Type.LESS_THAN_OPERATOR) - || type.equals(Type.GREATER_THAN_OPERATOR) - || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) - || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) - || type.equals(Type.BOOLEAN_OR) - || type.equals(Type.BOOLEAN_AND) - || type.equals(Type.MODULO_OPERATOR); + || type.equals(Type.SUBTRACTION_OPERATOR) + || type.equals(Type.MULTIPLICATION_OPERATOR) + || type.equals(Type.DIVISION_OPERATOR) + || type.equals(Type.EQUALS_OPERATOR) + || type.equals(Type.NOT_EQUALS_OPERATOR) + || type.equals(Type.LESS_THAN_OPERATOR) + || type.equals(Type.GREATER_THAN_OPERATOR) + || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.BOOLEAN_OR) + || type.equals(Type.BOOLEAN_AND) + || type.equals(Type.MODULO_OPERATOR); } - + public boolean isStrictNumericOperator() { return type.equals(Type.SUBTRACTION_OPERATOR) - || type.equals(Type.MULTIPLICATION_OPERATOR) - || type.equals(Type.DIVISION_OPERATOR) - || type.equals(Type.GREATER_THAN_OPERATOR) - || type.equals(Type.LESS_THAN_OPERATOR) - || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) - || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) - || type.equals(Type.MODULO_OPERATOR); + || type.equals(Type.MULTIPLICATION_OPERATOR) + || type.equals(Type.DIVISION_OPERATOR) + || type.equals(Type.GREATER_THAN_OPERATOR) + || type.equals(Type.LESS_THAN_OPERATOR) + || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.MODULO_OPERATOR); } - + public boolean isStrictBooleanOperator() { return type.equals(Type.BOOLEAN_AND) - || type.equals(Type.BOOLEAN_OR); + || type.equals(Type.BOOLEAN_OR); } - + public boolean isVariableDeclaration() { return type.equals(Type.STRING_VARIABLE) - || type.equals(Type.BOOLEAN_VARIABLE) - || type.equals(Type.NUMBER_VARIABLE); + || type.equals(Type.BOOLEAN_VARIABLE) + || type.equals(Type.NUMBER_VARIABLE); } - + public boolean isLoopLike() { return type.equals(Type.IF_STATEMENT) - || type.equals(Type.WHILE_LOOP) - || type.equals(Type.FOR_LOOP); + || type.equals(Type.WHILE_LOOP) + || type.equals(Type.FOR_LOOP); } - + public boolean isIdentifier() { return type.equals(Type.IDENTIFIER); } - + public enum Type { /** * Function identifier or language keyword */ IDENTIFIER, - + /** * Numeric literal */ diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java index 2c707b2c3..72438f3d4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java @@ -1,42 +1,47 @@ package com.dfsek.terra.addons.terrascript.tokenizer; -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; -import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.EOFException; -import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.FormatException; -import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.TokenizerException; import com.google.common.collect.Sets; import java.io.StringReader; import java.util.Set; import java.util.Stack; +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.EOFException; +import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.FormatException; +import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.TokenizerException; + + public class Tokenizer { - public static final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars + public static final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', + '>', '<', '!'); // Reserved chars private final Lookahead reader; private final Stack brackets = new Stack<>(); private Token current; private Token last; - + public Tokenizer(String data) throws ParseException { reader = new Lookahead(new StringReader(data + '\0')); current = fetchCheck(); } - + /** * Get the first token. * * @return First token + * * @throws ParseException If token does not exist */ public Token get() throws ParseException { if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition()); return current; } - + /** * Consume (get and remove) the first token. * * @return First token + * * @throws ParseException If token does not exist */ public Token consume() throws ParseException { @@ -45,16 +50,7 @@ public class Tokenizer { current = fetchCheck(); return temp; } - - /** - * Whether this {@code Tokenizer} contains additional tokens. - * - * @return {@code true} if more tokens are present, otherwise {@code false} - */ - public boolean hasNext() { - return !(current == null); - } - + private Token fetchCheck() throws ParseException { Token fetch = fetch(); if(fetch != null) { @@ -69,16 +65,16 @@ public class Tokenizer { } return fetch; } - + private Token fetch() throws TokenizerException { while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); - + while(reader.matches("//", true)) skipLine(); // Skip line if comment - + if(reader.matches("/*", true)) skipTo("*/"); // Skip multi line comment - + if(reader.current().isEOF()) return null; // EOF - + if(reader.matches("==", true)) return new Token("==", Token.Type.EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("!=", true)) @@ -91,14 +87,14 @@ public class Tokenizer { return new Token(">", Token.Type.GREATER_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("<", true)) return new Token("<", Token.Type.LESS_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); - - + + if(reader.matches("||", true)) return new Token("||", Token.Type.BOOLEAN_OR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("&&", true)) return new Token("&&", Token.Type.BOOLEAN_AND, new Position(reader.getLine(), reader.getIndex())); - - + + if(isNumberStart()) { StringBuilder num = new StringBuilder(); while(!reader.current().isEOF() && isNumberLike()) { @@ -106,7 +102,7 @@ public class Tokenizer { } return new Token(num.toString(), Token.Type.NUMBER, new Position(reader.getLine(), reader.getIndex())); } - + if(reader.current().is('"')) { reader.consume(); // Consume first quote StringBuilder string = new StringBuilder(); @@ -122,10 +118,10 @@ public class Tokenizer { string.append(reader.consume()); } reader.consume(); // Consume last quote - + return new Token(string.toString(), Token.Type.STRING, new Position(reader.getLine(), reader.getIndex())); } - + if(reader.current().is('(')) return new Token(reader.consume().toString(), Token.Type.GROUP_BEGIN, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is(')')) @@ -143,37 +139,39 @@ public class Tokenizer { if(reader.current().is('+')) return new Token(reader.consume().toString(), Token.Type.ADDITION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('-')) - return new Token(reader.consume().toString(), Token.Type.SUBTRACTION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token(reader.consume().toString(), Token.Type.SUBTRACTION_OPERATOR, + new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('*')) - return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR, + new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('/')) return new Token(reader.consume().toString(), Token.Type.DIVISION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('%')) return new Token(reader.consume().toString(), Token.Type.MODULO_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('!')) return new Token(reader.consume().toString(), Token.Type.BOOLEAN_NOT, new Position(reader.getLine(), reader.getIndex())); - + StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { Char c = reader.consume(); if(c.isWhitespace()) break; token.append(c); } - + String tokenString = token.toString(); - + if(tokenString.equals("true")) return new Token(tokenString, Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("false")) return new Token(tokenString, Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); - + if(tokenString.equals("num")) return new Token(tokenString, Token.Type.NUMBER_VARIABLE, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("str")) return new Token(tokenString, Token.Type.STRING_VARIABLE, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("bool")) return new Token(tokenString, Token.Type.BOOLEAN_VARIABLE, new Position(reader.getLine(), reader.getIndex())); - + if(tokenString.equals("if")) return new Token(tokenString, Token.Type.IF_STATEMENT, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("else")) @@ -182,7 +180,7 @@ public class Tokenizer { return new Token(tokenString, Token.Type.WHILE_LOOP, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("for")) return new Token(tokenString, Token.Type.FOR_LOOP, new Position(reader.getLine(), reader.getIndex())); - + if(tokenString.equals("return")) return new Token(tokenString, Token.Type.RETURN, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("continue")) @@ -191,32 +189,22 @@ public class Tokenizer { return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("fail")) return new Token(tokenString, Token.Type.FAIL, new Position(reader.getLine(), reader.getIndex())); - + if(tokenString.equals("id")) return new Token(tokenString, Token.Type.ID, new Position(reader.getLine(), reader.getIndex())); - + return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } - - private boolean isNumberLike() { - return reader.current().isDigit() - || reader.current().is('_', '.', 'E'); - } - - private boolean isNumberStart() { - return reader.current().isDigit() - || reader.current().is('.') && reader.next(1).isDigit(); - } - + private void skipLine() { while(!reader.current().isEOF() && !reader.current().isNewLine()) reader.consume(); consumeWhitespace(); } - + private void consumeWhitespace() { while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); // Consume whitespace. } - + private void skipTo(String s) throws EOFException { Position begin = new Position(reader.getLine(), reader.getIndex()); while(!reader.current().isEOF()) { @@ -228,9 +216,28 @@ public class Tokenizer { } throw new EOFException("No end of expression found.", begin); } - + + /** + * Whether this {@code Tokenizer} contains additional tokens. + * + * @return {@code true} if more tokens are present, otherwise {@code false} + */ + public boolean hasNext() { + return !(current == null); + } + + private boolean isNumberLike() { + return reader.current().isDigit() + || reader.current().is('_', '.', 'E'); + } + + private boolean isNumberStart() { + return reader.current().isDigit() + || reader.current().is('.') && reader.next(1).isDigit(); + } + public boolean isSyntaxSignificant(char c) { return syntaxSignificant.contains(c); } - + } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java index 6db82c522..8de70c536 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java @@ -2,14 +2,15 @@ package com.dfsek.terra.addons.terrascript.tokenizer.exceptions; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class EOFException extends TokenizerException { - + private static final long serialVersionUID = 3980047409902809440L; - + public EOFException(String message, Position position) { super(message, position); } - + public EOFException(String message, Position position, Throwable cause) { super(message, position, cause); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java index d62119016..5ddef18b9 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java @@ -2,14 +2,15 @@ package com.dfsek.terra.addons.terrascript.tokenizer.exceptions; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public class FormatException extends TokenizerException { - + private static final long serialVersionUID = -791308012940744455L; - + public FormatException(String message, Position position) { super(message, position); } - + public FormatException(String message, Position position, Throwable cause) { super(message, position, cause); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java index 05bad97b6..6798b10ab 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java @@ -3,14 +3,15 @@ package com.dfsek.terra.addons.terrascript.tokenizer.exceptions; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.tokenizer.Position; + public abstract class TokenizerException extends ParseException { - + private static final long serialVersionUID = 2792384010083575420L; - + public TokenizerException(String message, Position position) { super(message, position); } - + public TokenizerException(String message, Position position, Throwable cause) { super(message, position, cause); } diff --git a/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java b/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java index 9b50801cc..5b033f8e8 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java +++ b/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java @@ -1,15 +1,17 @@ package structure; -import com.dfsek.terra.addons.terrascript.tokenizer.Lookahead; import org.junit.jupiter.api.Test; import java.io.StringReader; +import com.dfsek.terra.addons.terrascript.tokenizer.Lookahead; + + public class LookaheadTest { @Test public void lookahead() { Lookahead lookahead = new Lookahead(new StringReader("Test string...")); - + for(int i = 0; lookahead.next(i) != null; i++) { System.out.print(lookahead.next(i).getCharacter()); } diff --git a/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java b/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java index d8e8b6ade..d5fa937e2 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java +++ b/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java @@ -1,6 +1,15 @@ package structure; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.dfsek.terra.addons.terrascript.parser.Parser; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.Block; @@ -10,31 +19,24 @@ import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.variables.Variable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.Test; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.List; -import java.util.Map; public class ParserTest { @Test public void parse() throws IOException, ParseException { Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"), Charset.defaultCharset())); - + parser.registerFunction("test", new FunctionBuilder() { @Override public Test1 build(List> argumentList, Position position) { return new Test1(argumentList.get(0), argumentList.get(1), position); } - + @Override public int argNumber() { return 2; } - + @Override public Returnable.ReturnType getArgument(int position) { switch(position) { @@ -46,41 +48,42 @@ public class ParserTest { return null; } } - + }); - + long l = System.nanoTime(); Block block = parser.parse(); long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - + block.apply(null, new HashMap<>()); - + block.apply(null, new HashMap<>()); } - + private static class Test1 implements Function { private final Returnable a; private final Returnable b; private final Position position; - + public Test1(Returnable a, Returnable b, Position position) { this.a = a; this.b = b; this.position = position; } - + @Override public Void apply(ImplementationArguments implementationArguments, Map> variableMap) { - System.out.println("string: " + a.apply(implementationArguments, variableMap) + ", double: " + b.apply(implementationArguments, variableMap)); + System.out.println("string: " + a.apply(implementationArguments, variableMap) + ", double: " + + b.apply(implementationArguments, variableMap)); return null; } - + @Override public Position getPosition() { return position; } - + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 0058624fb..dabfe2ff0 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -1,8 +1,8 @@ dependencies { "shadedApi"("com.dfsek:Paralithic:0.4.0") - + "shadedApi"("com.dfsek.tectonic:common:2.1.2") - + "shadedApi"("net.jafama:jafama:2.3.2") } diff --git a/common/api/src/main/java/com/dfsek/terra/api/Logger.java b/common/api/src/main/java/com/dfsek/terra/api/Logger.java index d0026b3ce..d4815ee43 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/Logger.java +++ b/common/api/src/main/java/com/dfsek/terra/api/Logger.java @@ -2,11 +2,11 @@ package com.dfsek.terra.api; public interface Logger { void info(String message); - + void warning(String message); - + void severe(String message); - + default void stack(Throwable t) { t.printStackTrace(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/TerraPlugin.java b/common/api/src/main/java/com/dfsek/terra/api/TerraPlugin.java index 9d2eba55a..eb36c835a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/TerraPlugin.java +++ b/common/api/src/main/java/com/dfsek/terra/api/TerraPlugin.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api; +import java.io.File; + import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.PluginConfig; @@ -12,40 +14,17 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.tectonic.LoaderRegistrar; -import java.io.File; /** * Represents a Terra mod/plugin instance. */ public interface TerraPlugin extends LoaderRegistrar { - WorldHandle getWorldHandle(); - Logger logger(); - - PluginConfig getTerraConfig(); - - File getDataFolder(); - - Language getLanguage(); - - CheckedRegistry getConfigRegistry(); - - Registry getAddons(); - + boolean reload(); - - ItemHandle getItemHandle(); - + String platformName(); - - Logger getDebugLogger(); - - EventManager getEventManager(); - - default String getVersion() { - return "@VERSION@"; - } - + /** * Runs a task that may or may not be thread safe, depending on platform. *

@@ -56,6 +35,28 @@ public interface TerraPlugin extends LoaderRegistrar { default void runPossiblyUnsafeTask(Runnable task) { task.run(); } - + + WorldHandle getWorldHandle(); + + PluginConfig getTerraConfig(); + + File getDataFolder(); + + Language getLanguage(); + + CheckedRegistry getConfigRegistry(); + + Registry getAddons(); + + ItemHandle getItemHandle(); + + Logger getDebugLogger(); + + EventManager getEventManager(); + + default String getVersion() { + return "@VERSION@"; + } + Profiler getProfiler(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java index 1771a77d9..023ffde61 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java @@ -1,15 +1,22 @@ package com.dfsek.terra.api.addon; +import org.jetbrains.annotations.NotNull; + import com.dfsek.terra.api.addon.annotations.Addon; import com.dfsek.terra.api.addon.annotations.Author; import com.dfsek.terra.api.addon.annotations.Version; -import org.jetbrains.annotations.NotNull; + /** * Represents an entry point for an com.dfsek.terra.addon. Implementations must be annotated with {@link Addon}. */ public abstract class TerraAddon { + /** + * Invoked immediately after an com.dfsek.terra.addon is loaded. + */ + public abstract void initialize(); + /** * Gets the version of this com.dfsek.terra.addon. * @@ -19,7 +26,7 @@ public abstract class TerraAddon { Version version = getClass().getAnnotation(Version.class); return version == null ? "0.1.0" : version.value(); } - + /** * Gets the author of this com.dfsek.terra.addon. * @@ -29,7 +36,7 @@ public abstract class TerraAddon { Author author = getClass().getAnnotation(Author.class); return author == null ? "Anon Y. Mous" : author.value(); } - + /** * Gets the name (ID) of this com.dfsek.terra.addon. * @@ -38,12 +45,9 @@ public abstract class TerraAddon { public final @NotNull String getName() { Addon addon = getClass().getAnnotation(Addon.class); if(addon == null) - throw new IllegalStateException("Addon annotation not present"); // This should never happen; the presence of this annotation is checked by the com.dfsek.terra.addon loader. + throw new IllegalStateException( + "Addon annotation not present"); // This should never happen; the presence of this annotation is checked by the com + // .dfsek.terra.addon loader. return addon.value(); } - - /** - * Invoked immediately after an com.dfsek.terra.addon is loaded. - */ - public abstract void initialize(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Addon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Addon.java index 3ca6354c9..a10b0bd50 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Addon.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Addon.java @@ -7,6 +7,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Specifies that the annotated class is an entry point for a Terra com.dfsek.terra.addon. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Author.java b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Author.java index 9c46e8eab..879e57553 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Author.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Author.java @@ -7,6 +7,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Optional annotation that specifies the author of an com.dfsek.terra.addon. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Depends.java b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Depends.java index 83b5b01fd..73c6bcb94 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Depends.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Depends.java @@ -7,6 +7,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Optional annotation that specifies dependencies of an com.dfsek.terra.addon. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Version.java b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Version.java index 63afd191f..b52c027ff 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Version.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/annotations/Version.java @@ -7,6 +7,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Optional annotation that specifies the version of an com.dfsek.terra.addon. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java index ce108c345..39b91cf12 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java @@ -3,10 +3,11 @@ package com.dfsek.terra.api.block; import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.block.state.BlockState; + public interface BlockType extends Handle { BlockState getDefaultData(); - + boolean isSolid(); - + boolean isWater(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java index 1809d6793..89a3cd610 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java @@ -4,20 +4,21 @@ import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.vector.Vector3; + public interface BlockEntity extends Handle { - Vector3 getPosition(); - - int getX(); - - int getY(); - - int getZ(); - - BlockState getBlockData(); - boolean update(boolean applyPhysics); - + default void applyState(String state) { // Do nothing by default. } + + Vector3 getPosition(); + + int getX(); + + int getY(); + + int getZ(); + + BlockState getBlockData(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java index 07529b1e9..6266f4e79 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java @@ -2,5 +2,6 @@ package com.dfsek.terra.api.block.entity; import com.dfsek.terra.api.inventory.BlockInventoryHolder; + public interface Container extends BlockEntity, BlockInventoryHolder { } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java index c9133ef46..c0497c562 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java @@ -1,38 +1,40 @@ package com.dfsek.terra.api.block.entity; -import com.dfsek.terra.api.entity.EntityType; import org.jetbrains.annotations.NotNull; +import com.dfsek.terra.api.entity.EntityType; + + public interface MobSpawner extends BlockEntity { EntityType getSpawnedType(); - + void setSpawnedType(@NotNull EntityType creatureType); - + int getDelay(); - + void setDelay(int delay); - + int getMinSpawnDelay(); - + void setMinSpawnDelay(int delay); - + int getMaxSpawnDelay(); - + void setMaxSpawnDelay(int delay); - + int getSpawnCount(); - + void setSpawnCount(int spawnCount); - + int getMaxNearbyEntities(); - + void setMaxNearbyEntities(int maxNearbyEntities); - + int getRequiredPlayerRange(); - + void setRequiredPlayerRange(int requiredPlayerRange); - + int getSpawnRange(); - + void setSpawnRange(int spawnRange); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java index 97d19c2a3..f3bef5e3e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java @@ -3,12 +3,13 @@ package com.dfsek.terra.api.block.entity; import java.util.HashMap; import java.util.Map; + public class SerialState { protected final Map> properties = new HashMap<>(); - + public SerialState() { } - + public static Map parse(String props) { String[] sep = props.split(","); Map map = new HashMap<>(); @@ -17,51 +18,7 @@ public class SerialState { } return map; } - - private void checkExists(String prop) { - if(!properties.containsKey(prop)) throw new IllegalArgumentException("No such property \"" + prop + "\""); - } - - private void checkType(Class clazz, Object o, String id) { - if(!clazz.isInstance(o)) - throw new IllegalArgumentException("Invalid data for property " + id + ": " + o); - } - - public void setProperty(String id, Object value) { - checkExists(id); - Property prop = properties.get(id); - checkType(prop.getValueClass(), value, id); - prop.setValue(value); - } - - public int getInteger(String id) { - checkExists(id); - Property prop = properties.get(id); - checkType(Integer.class, prop.getValue(), id); - return (Integer) prop.getValue(); - } - - public String getString(String id) { - checkExists(id); - Property prop = properties.get(id); - checkType(String.class, prop.getValue(), id); - return (String) prop.getValue(); - } - - public long getLong(String id) { - checkExists(id); - Property prop = properties.get(id); - checkType(Long.class, prop.getValue(), id); - return (Long) prop.getValue(); - } - - public boolean getBoolean(String id) { - checkExists(id); - Property prop = properties.get(id); - checkType(Boolean.class, prop.getValue(), id); - return (Boolean) prop.getValue(); - } - + @SuppressWarnings("unchecked") public T get(String id, Class clazz) { checkExists(id); @@ -69,24 +26,69 @@ public class SerialState { checkType(clazz, prop.getValue(), id); return (T) prop.getValue(); } - + + private void checkExists(String prop) { + if(!properties.containsKey(prop)) throw new IllegalArgumentException("No such property \"" + prop + "\""); + } + + private void checkType(Class clazz, Object o, String id) { + if(!clazz.isInstance(o)) + throw new IllegalArgumentException("Invalid data for property " + id + ": " + o); + } + + public void setProperty(String id, Object value) { + checkExists(id); + Property prop = properties.get(id); + checkType(prop.getValueClass(), value, id); + prop.setValue(value); + } + + public int getInteger(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(Integer.class, prop.getValue(), id); + return (Integer) prop.getValue(); + } + + public String getString(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(String.class, prop.getValue(), id); + return (String) prop.getValue(); + } + + public long getLong(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(Long.class, prop.getValue(), id); + return (Long) prop.getValue(); + } + + public boolean getBoolean(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(Boolean.class, prop.getValue(), id); + return (Boolean) prop.getValue(); + } + + protected static class Property { private final Class clazz; private Object value; - + public Property(Class clazz) { this.clazz = clazz; } - + public Class getValueClass() { return clazz; } - + @SuppressWarnings("unchecked") public T getValue() { return (T) value; } - + public void setValue(Object value) { this.value = value; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java index 8c1a4bfe6..f8c148303 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java @@ -2,10 +2,11 @@ package com.dfsek.terra.api.block.entity; import org.jetbrains.annotations.NotNull; + public interface Sign extends BlockEntity { - @NotNull String[] getLines(); - - @NotNull String getLine(int index) throws IndexOutOfBoundsException; - void setLine(int index, @NotNull String line) throws IndexOutOfBoundsException; + + @NotNull String[] getLines(); + + @NotNull String getLine(int index) throws IndexOutOfBoundsException; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java index 83e672a53..08798ad44 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java @@ -1,38 +1,39 @@ package com.dfsek.terra.api.block.state; +import java.util.function.Consumer; + import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.properties.Property; -import java.util.function.Consumer; public interface BlockState extends Cloneable, Handle { - - BlockType getBlockType(); - + boolean matches(BlockState other); - + BlockState clone(); - - String getAsString(); - - boolean isAir(); - - boolean isStructureVoid(); - + boolean has(Property property); - + T get(Property property); - + BlockState set(Property property, T value); - - default BlockState setIfPresent(Property property, T value) { - if(has(property)) set(property, value); - return this; - } - + default BlockState ifProperty(Property property, Consumer action) { if(has(property)) action.accept(this); return this; } + + default BlockState setIfPresent(Property property, T value) { + if(has(property)) set(property, value); + return this; + } + + BlockType getBlockType(); + + String getAsString(); + + boolean isAir(); + + boolean isStructureVoid(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java index 041303d87..839f78287 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java @@ -2,10 +2,11 @@ package com.dfsek.terra.api.block.state.properties; import java.util.Collection; + public interface Property { - Class getType(); - - String getName(); - Collection values(); + + Class getType(); + + String getName(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java index f58a9307a..511d9278a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java @@ -1,27 +1,28 @@ package com.dfsek.terra.api.block.state.properties.base; -import com.dfsek.terra.api.block.state.properties.Property; - import java.util.Arrays; import java.util.Collection; +import com.dfsek.terra.api.block.state.properties.Property; + + public interface BooleanProperty extends Property { static BooleanProperty of(String name) { return new BooleanProperty() { private static final Collection BOOLEANS = Arrays.asList(true, false); - - @Override - public String getName() { - return name; - } - + @Override public Collection values() { return BOOLEANS; } + + @Override + public String getName() { + return name; + } }; } - + @Override default Class getType() { return Boolean.class; diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java index 777405d43..af5565485 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java @@ -1,30 +1,31 @@ package com.dfsek.terra.api.block.state.properties.base; +import java.util.Arrays; +import java.util.Collection; + import com.dfsek.terra.api.block.state.properties.Property; import com.dfsek.terra.api.util.generic.Lazy; -import java.util.Arrays; -import java.util.Collection; public interface EnumProperty> extends Property { static > EnumProperty of(String name, Class clazz) { return new EnumProperty() { private final Lazy> constants = Lazy.lazy(() -> Arrays.asList(clazz.getEnumConstants())); - - @Override - public Class getType() { - return clazz; - } - - @Override - public String getName() { - return name; - } - + @Override public Collection values() { return constants.value(); } + + @Override + public Class getType() { + return clazz; + } + + @Override + public String getName() { + return name; + } }; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java index ab4cb39c6..eb5a22ea7 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java @@ -1,12 +1,13 @@ package com.dfsek.terra.api.block.state.properties.base; -import com.dfsek.terra.api.block.state.properties.Property; -import com.dfsek.terra.api.util.generic.Construct; - import java.util.ArrayList; import java.util.Collection; import java.util.List; +import com.dfsek.terra.api.block.state.properties.Property; +import com.dfsek.terra.api.util.generic.Construct; + + public interface IntProperty extends Property { static IntProperty of(String name, int min, int max) { return new IntProperty() { @@ -17,19 +18,19 @@ public interface IntProperty extends Property { } return ints; }); - - @Override - public String getName() { - return name; - } - + @Override public Collection values() { return collection; } + + @Override + public String getName() { + return name; + } }; } - + @Override default Class getType() { return Integer.class; diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java index e69940949..f1c8ba0f3 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java @@ -7,30 +7,31 @@ import com.dfsek.terra.api.block.state.properties.enums.RailShape; import com.dfsek.terra.api.block.state.properties.enums.RedstoneConnection; import com.dfsek.terra.api.block.state.properties.enums.WallHeight; + public final class Properties { public static final EnumProperty DIRECTION = EnumProperty.of("facing", Direction.class); public static final EnumProperty AXIS = EnumProperty.of("axis", Axis.class); - + public static final BooleanProperty NORTH = BooleanProperty.of("north"); public static final BooleanProperty SOUTH = BooleanProperty.of("south"); public static final BooleanProperty EAST = BooleanProperty.of("east"); public static final BooleanProperty WEST = BooleanProperty.of("west"); - + public static final EnumProperty NORTH_HEIGHT = EnumProperty.of("north", WallHeight.class); public static final EnumProperty SOUTH_HEIGHT = EnumProperty.of("south", WallHeight.class); public static final EnumProperty EAST_HEIGHT = EnumProperty.of("east", WallHeight.class); public static final EnumProperty WEST_HEIGHT = EnumProperty.of("west", WallHeight.class); - + public static final EnumProperty NORTH_CONNECTION = EnumProperty.of("north", RedstoneConnection.class); public static final EnumProperty SOUTH_CONNECTION = EnumProperty.of("south", RedstoneConnection.class); public static final EnumProperty EAST_CONNECTION = EnumProperty.of("east", RedstoneConnection.class); public static final EnumProperty WEST_CONNECTION = EnumProperty.of("west", RedstoneConnection.class); - - + + public static final EnumProperty RAIL_SHAPE = EnumProperty.of("shape", RailShape.class); public static final EnumProperty HALF = EnumProperty.of("half", Half.class); - + public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 15); - + public static final BooleanProperty WATERLOGGED = BooleanProperty.of("waterlogged"); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java index 98152b027..9d0156929 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.block.state.properties.enums; public enum Axis { - X, Y, Z + X, + Y, + Z } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java index ac32fdb4a..4a3578bc9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.block.state.properties.enums; import com.dfsek.terra.api.structure.rotation.Rotation; import com.dfsek.terra.api.util.generic.Construct; + public enum Direction { NORTH(0, 0, 0, -1), EAST(1, 1, 0, 0), @@ -10,22 +11,22 @@ public enum Direction { WEST(3, -1, 0, 0), UP(-1, 0, 1, 0), DOWN(-1, 0, -1, 0); - - private static final Direction[] rotations = Construct.construct(() -> new Direction[] {NORTH, SOUTH, EAST, WEST}); - + + private static final Direction[] rotations = Construct.construct(() -> new Direction[]{ NORTH, SOUTH, EAST, WEST }); + private final int rotation; - + private final int modX; private final int modY; private final int modZ; - + Direction(int rotation, int modX, int modY, int modZ) { this.rotation = rotation; this.modX = modX; this.modY = modY; this.modZ = modZ; } - + public Direction rotate(Rotation rotation) { switch(this) { case UP: @@ -35,19 +36,7 @@ public enum Direction { return rotations[(this.rotation + rotation.getDegrees() / 90) % 4]; } } - - public int getModX() { - return modX; - } - - public int getModY() { - return modY; - } - - public int getModZ() { - return modZ; - } - + public Direction opposite() { switch(this) { case DOWN: @@ -63,7 +52,19 @@ public enum Direction { case SOUTH: return NORTH; } - + throw new IllegalStateException(); } + + public int getModX() { + return modX; + } + + public int getModY() { + return modY; + } + + public int getModZ() { + return modZ; + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java index e0088dd13..50d32bef7 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java @@ -9,7 +9,7 @@ public enum Half { * The bottom half of the block, normally with the lower y coordinate. */ BOTTOM, - + /** * Some blocks, e.g. slabs, can occupy both halves. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java index 3219f6f3f..08a01a163 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.block.state.properties.enums; public enum RedstoneConnection { - NONE, SIDE, UP + NONE, + SIDE, + UP } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java index 73af8a898..eda29ef85 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.block.state.properties.enums; public enum WallHeight { - LOW, NONE, TALL + LOW, + NONE, + TALL } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/CommandManager.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandManager.java index 4c5618531..1ebe09b91 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/CommandManager.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandManager.java @@ -1,17 +1,18 @@ package com.dfsek.terra.api.command; +import java.util.List; + import com.dfsek.terra.api.command.exception.CommandException; import com.dfsek.terra.api.command.exception.MalformedCommandException; import com.dfsek.terra.api.entity.CommandSender; -import java.util.List; public interface CommandManager { void execute(String command, CommandSender sender, List args) throws CommandException; - + void register(String name, Class clazz) throws MalformedCommandException; - + List tabComplete(String command, CommandSender sender, List args) throws CommandException; - + int getMaxArgumentDepth(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/CommandTemplate.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandTemplate.java index 86cbe8dad..21e30b2cc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/CommandTemplate.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandTemplate.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.command; import com.dfsek.terra.api.entity.CommandSender; + public interface CommandTemplate { void execute(CommandSender sender); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Argument.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Argument.java index d0c91a965..ddcf7b7e4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Argument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Argument.java @@ -1,25 +1,26 @@ package com.dfsek.terra.api.command.annotation; -import com.dfsek.terra.api.command.arg.ArgumentParser; -import com.dfsek.terra.api.command.arg.StringArgumentParser; -import com.dfsek.terra.api.command.tab.NothingCompleter; -import com.dfsek.terra.api.command.tab.TabCompleter; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import com.dfsek.terra.api.command.arg.ArgumentParser; +import com.dfsek.terra.api.command.arg.StringArgumentParser; +import com.dfsek.terra.api.command.tab.NothingCompleter; +import com.dfsek.terra.api.command.tab.TabCompleter; + + @Target(ElementType.ANNOTATION_TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Argument { String value(); - + boolean required() default true; - + Class tabCompleter() default NothingCompleter.class; - + Class> argumentParser() default StringArgumentParser.class; - + String defaultValue() default ""; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Command.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Command.java index fb5fd81ea..021babec4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Command.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Command.java @@ -5,14 +5,15 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Command { - Argument[] arguments() default {}; - - Switch[] switches() default {}; - - Subcommand[] subcommands() default {}; - + Argument[] arguments() default { }; + + Switch[] switches() default { }; + + Subcommand[] subcommands() default { }; + String usage() default ""; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Subcommand.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Subcommand.java index 7f729ba0a..7140b7db6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Subcommand.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Subcommand.java @@ -1,18 +1,19 @@ package com.dfsek.terra.api.command.annotation; -import com.dfsek.terra.api.command.CommandTemplate; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import com.dfsek.terra.api.command.CommandTemplate; + + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Subcommand { String value(); - - String[] aliases() default {}; - + + String[] aliases() default { }; + Class clazz(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Switch.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Switch.java index 16ea3e21a..1abd9b121 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Switch.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/Switch.java @@ -5,10 +5,11 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Switch { String value(); - - String[] aliases() default {}; + + String[] aliases() default { }; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/ArgumentTarget.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/ArgumentTarget.java index 89dbc5245..edd6f82a6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/ArgumentTarget.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/ArgumentTarget.java @@ -5,6 +5,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ArgumentTarget { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/SwitchTarget.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/SwitchTarget.java index 67478373a..7d3f327df 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/SwitchTarget.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/inject/SwitchTarget.java @@ -5,6 +5,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface SwitchTarget { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/DebugCommand.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/DebugCommand.java index 174710401..280eaa9c2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/DebugCommand.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/DebugCommand.java @@ -5,6 +5,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Command may only be executed with debug mode enabled. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/PlayerCommand.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/PlayerCommand.java index fd7b1e320..b7922c6a7 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/PlayerCommand.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/PlayerCommand.java @@ -5,6 +5,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Marks command as player-only */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/WorldCommand.java b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/WorldCommand.java index c51ee570b..1d3dd722b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/WorldCommand.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/annotation/type/WorldCommand.java @@ -5,6 +5,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** * Command may only be executed in a Terra world. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arg/ArgumentParser.java b/common/api/src/main/java/com/dfsek/terra/api/command/arg/ArgumentParser.java index fe34f088a..abb169575 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arg/ArgumentParser.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arg/ArgumentParser.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.command.arg; import com.dfsek.terra.api.entity.CommandSender; + public interface ArgumentParser { T parse(CommandSender sender, String arg); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arg/DoubleArgumentParser.java b/common/api/src/main/java/com/dfsek/terra/api/command/arg/DoubleArgumentParser.java index d05ae0f89..4eadb86b8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arg/DoubleArgumentParser.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arg/DoubleArgumentParser.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.command.arg; import com.dfsek.terra.api.entity.CommandSender; + public class DoubleArgumentParser implements ArgumentParser { @Override public Double parse(CommandSender sender, String arg) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arg/IntegerArgumentParser.java b/common/api/src/main/java/com/dfsek/terra/api/command/arg/IntegerArgumentParser.java index 5f6d34ad6..2f5313583 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arg/IntegerArgumentParser.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arg/IntegerArgumentParser.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.command.arg; import com.dfsek.terra.api.entity.CommandSender; + public class IntegerArgumentParser implements ArgumentParser { @Override public Integer parse(CommandSender sender, String arg) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arg/StringArgumentParser.java b/common/api/src/main/java/com/dfsek/terra/api/command/arg/StringArgumentParser.java index bba6de6bd..c7d22ea39 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arg/StringArgumentParser.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arg/StringArgumentParser.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.command.arg; import com.dfsek.terra.api.entity.CommandSender; + public class StringArgumentParser implements ArgumentParser { @Override public String parse(CommandSender sender, String arg) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/exception/CommandException.java b/common/api/src/main/java/com/dfsek/terra/api/command/exception/CommandException.java index 3fd6537ef..2af650a0e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/exception/CommandException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/exception/CommandException.java @@ -2,11 +2,11 @@ package com.dfsek.terra.api.command.exception; public abstract class CommandException extends Exception { private static final long serialVersionUID = -2955328495045879822L; - + public CommandException(String message) { super(message); } - + public CommandException(String message, Throwable cause) { super(message, cause); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/exception/ExecutionException.java b/common/api/src/main/java/com/dfsek/terra/api/command/exception/ExecutionException.java index 061bfc64b..ac23ac64c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/exception/ExecutionException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/exception/ExecutionException.java @@ -2,11 +2,11 @@ package com.dfsek.terra.api.command.exception; public class ExecutionException extends CommandException { private static final long serialVersionUID = -6345523475880607959L; - + public ExecutionException(String message) { super(message); } - + public ExecutionException(String message, Throwable cause) { super(message, cause); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/exception/InvalidArgumentsException.java b/common/api/src/main/java/com/dfsek/terra/api/command/exception/InvalidArgumentsException.java index 5ad88d0b3..8302d3118 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/exception/InvalidArgumentsException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/exception/InvalidArgumentsException.java @@ -2,11 +2,11 @@ package com.dfsek.terra.api.command.exception; public class InvalidArgumentsException extends CommandException { private static final long serialVersionUID = 7563619667472569824L; - + public InvalidArgumentsException(String message) { super(message); } - + public InvalidArgumentsException(String message, Throwable cause) { super(message, cause); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/exception/MalformedCommandException.java b/common/api/src/main/java/com/dfsek/terra/api/command/exception/MalformedCommandException.java index c124a8b85..f728c707e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/exception/MalformedCommandException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/exception/MalformedCommandException.java @@ -5,11 +5,11 @@ package com.dfsek.terra.api.command.exception; */ public class MalformedCommandException extends CommandException { private static final long serialVersionUID = -5417760860407895496L; - + public MalformedCommandException(String message) { super(message); } - + public MalformedCommandException(String message, Throwable cause) { super(message, cause); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/exception/SwitchFormatException.java b/common/api/src/main/java/com/dfsek/terra/api/command/exception/SwitchFormatException.java index c7e545ae7..944e2b4a0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/exception/SwitchFormatException.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/exception/SwitchFormatException.java @@ -2,11 +2,11 @@ package com.dfsek.terra.api.command.exception; public class SwitchFormatException extends CommandException { private static final long serialVersionUID = -965858989317844628L; - + public SwitchFormatException(String message) { super(message); } - + public SwitchFormatException(String message, Throwable cause) { super(message, cause); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/tab/NothingCompleter.java b/common/api/src/main/java/com/dfsek/terra/api/command/tab/NothingCompleter.java index 4b7ab26cf..f4d7e2fa4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/tab/NothingCompleter.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/tab/NothingCompleter.java @@ -1,10 +1,11 @@ package com.dfsek.terra.api.command.tab; -import com.dfsek.terra.api.entity.CommandSender; - import java.util.Collections; import java.util.List; +import com.dfsek.terra.api.entity.CommandSender; + + public class NothingCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/tab/TabCompleter.java b/common/api/src/main/java/com/dfsek/terra/api/command/tab/TabCompleter.java index c7c3174da..f0836bd1e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/tab/TabCompleter.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/tab/TabCompleter.java @@ -1,8 +1,9 @@ package com.dfsek.terra.api.command.tab; +import java.util.List; + import com.dfsek.terra.api.entity.CommandSender; -import java.util.List; public interface TabCompleter { List complete(CommandSender sender); diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java b/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java index 0abb43e3b..7683bb06b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java @@ -1,7 +1,9 @@ package com.dfsek.terra.api.config; import com.dfsek.tectonic.config.ConfigTemplate; + import com.dfsek.terra.api.StringIdentifiable; + public interface AbstractableTemplate extends ConfigTemplate, StringIdentifiable { } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java index 33baf21d4..d0648e9c9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java @@ -2,8 +2,10 @@ package com.dfsek.terra.api.config; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.LoadException; + import com.dfsek.terra.api.TerraPlugin; + public interface ConfigFactory { O build(C config, TerraPlugin main) throws LoadException; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java index 5d48db654..d92c9cfe9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java @@ -1,5 +1,10 @@ package com.dfsek.terra.api.config; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; +import java.util.Set; + import com.dfsek.terra.api.StringIdentifiable; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.registry.CheckedRegistry; @@ -13,52 +18,49 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; import com.dfsek.terra.api.world.generator.GenerationStageProvider; -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; -import java.util.Set; public interface ConfigPack extends LoaderRegistrar, LoaderHolder, RegistryHolder, StringIdentifiable { + WorldConfig toWorldConfig(World world); + + void registerConfigType(ConfigType type, String id, int priority); + + Set addons(); + + boolean vanillaMobs(); + + boolean vanillaStructures(); + + boolean vanillaCaves(); + + boolean disableStructures(); + + boolean doBetaCarvers(); + + boolean vanillaFlora(); + BiomeProvider getBiomeProviderBuilder(); - + CheckedRegistry getOrCreateRegistry(Type clazz); + default CheckedRegistry getOrCreateRegistry(Class clazz) { return getOrCreateRegistry((Type) clazz); } - + default CheckedRegistry getOrCreateRegistry(TypeKey type) { return getOrCreateRegistry(type.getType()); } - - WorldConfig toWorldConfig(World world); - + List getStages(); - - void registerConfigType(ConfigType type, String id, int priority); - + Loader getLoader(); - - Set addons(); - + String getAuthor(); - + String getVersion(); - - boolean vanillaMobs(); - - boolean vanillaStructures(); - - boolean vanillaCaves(); - - boolean disableStructures(); - + Map getLocatable(); - - boolean doBetaCarvers(); - - boolean vanillaFlora(); - + RegistryFactory getRegistryFactory(); - + ChunkGeneratorProvider getGeneratorProvider(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java index 7cefbda01..4384ba5a2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java @@ -1,17 +1,18 @@ package com.dfsek.terra.api.config; +import java.util.function.Supplier; + import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.util.reflection.TypeKey; -import java.util.function.Supplier; public interface ConfigType { - T getTemplate(ConfigPack pack, TerraPlugin main); - - ConfigFactory getFactory(); - - TypeKey getTypeKey(); - Supplier> registrySupplier(ConfigPack pack); + + T getTemplate(ConfigPack pack, TerraPlugin main); + + ConfigFactory getFactory(); + + TypeKey getTypeKey(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java index 03c7f5f0d..f09b91491 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java @@ -9,20 +9,22 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; + public interface Loader { - + Loader thenNames(Consumer> consumer) throws ConfigException; - + Loader thenEntries(Consumer>> consumer) throws ConfigException; - + /** * Get a single file from this Loader. * * @param singleFile File to get + * * @return InputStream from file. */ InputStream get(String singleFile) throws IOException; - + /** * Open a subdirectory. * @@ -30,7 +32,7 @@ public interface Loader { * @param extension */ Loader open(String directory, String extension); - + /** * Close all InputStreams opened. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java index 1f81ec6ed..62d242d3f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java @@ -2,34 +2,35 @@ package com.dfsek.terra.api.config; import com.dfsek.terra.api.TerraPlugin; + public interface PluginConfig { void load(TerraPlugin main); - - String getLanguage(); - - boolean isDebugCommands(); - - boolean isDebugLogging(); - - boolean isDebugProfiler(); - - boolean isDebugScript(); - - long getDataSaveInterval(); - - int getBiomeSearchResolution(); - - int getCarverCacheSize(); - - int getStructureCache(); - - int getSamplerCache(); - - int getMaxRecursion(); - - int getBiomeCache(); - - int getProviderCache(); - + boolean dumpDefaultConfig(); + + String getLanguage(); + + boolean isDebugCommands(); + + boolean isDebugLogging(); + + boolean isDebugProfiler(); + + boolean isDebugScript(); + + long getDataSaveInterval(); + + int getBiomeSearchResolution(); + + int getCarverCacheSize(); + + int getStructureCache(); + + int getSamplerCache(); + + int getMaxRecursion(); + + int getBiomeCache(); + + int getProviderCache(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/WorldConfig.java b/common/api/src/main/java/com/dfsek/terra/api/config/WorldConfig.java index 5333db06b..590dee335 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/WorldConfig.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/WorldConfig.java @@ -1,41 +1,42 @@ package com.dfsek.terra.api.config; +import java.util.Map; + import com.dfsek.terra.api.StringIdentifiable; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.SamplerCache; -import java.util.Map; public interface WorldConfig extends StringIdentifiable { - Registry getRegistry(Class clazz); - - World getWorld(); - - SamplerCache getSamplerCache(); - - BiomeProvider getProvider(); - - ConfigPack getPack(); - int elevationBlend(); - + boolean disableTrees(); - + boolean disableCarving(); - + boolean disableOres(); - + boolean disableFlora(); - + boolean disableStructures(); - + + Registry getRegistry(Class clazz); + + World getWorld(); + + SamplerCache getSamplerCache(); + + BiomeProvider getProvider(); + + ConfigPack getPack(); + String getAuthor(); - + String getVersion(); - + Map getLocatable(); - + boolean isDisableSaplings(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java b/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java index cfac598c7..33e7fb6bc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java @@ -5,6 +5,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) public @interface Meta { diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java index cc005485a..953809a97 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.entity; import com.dfsek.terra.api.Handle; + public interface CommandSender extends Handle { void sendMessage(String message); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java index 96811a9a6..63e0a701d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java @@ -1,15 +1,15 @@ package com.dfsek.terra.api.entity; -import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.World; -public interface Entity extends Handle, CommandSender { + +public interface Entity extends CommandSender { Vector3 position(); - + void position(Vector3 position); - + void world(World world); - + World world(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java index f86525b82..79e3c1043 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java @@ -2,5 +2,6 @@ package com.dfsek.terra.api.entity; import com.dfsek.terra.api.Handle; + public interface EntityType extends Handle { } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java b/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java index dc509792d..4e8692552 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.event; import com.dfsek.terra.api.event.events.Event; + public interface EventHandler { void handle(Event event); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java b/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java index 7707971d2..1645376f5 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java @@ -1,8 +1,7 @@ package com.dfsek.terra.api.event; import com.dfsek.terra.api.event.events.Event; -import com.dfsek.terra.api.event.functional.EventContext; -import com.dfsek.terra.api.util.reflection.TypeKey; + /** * Manages event registration and triggering. @@ -14,8 +13,8 @@ public interface EventManager { * @param event Event to pass to all registered EventListeners. */ void callEvent(Event event); - + void registerHandler(Class clazz, T handler); - + T getHandler(Class clazz); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java index e6fdd5319..6b0f70b98 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java @@ -2,17 +2,18 @@ package com.dfsek.terra.api.event.events; import com.dfsek.terra.api.util.mutable.MutableBoolean; + /** * Abstract class containing basic {@link Cancellable} implementation. */ public abstract class AbstractCancellable implements Cancellable { private final MutableBoolean cancelled = new MutableBoolean(false); - + @Override public boolean isCancelled() { return cancelled.get(); } - + @Override public void setCancelled(boolean cancelled) { this.cancelled.set(cancelled); diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java index ca7bccdf7..5c181ac39 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java @@ -12,7 +12,7 @@ public interface Cancellable extends Event { * @return Whether event is cancelled. */ boolean isCancelled(); - + /** * Set the cancellation status of the event. * diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java index 25c1eea10..aff5d7d94 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.event.events; import com.dfsek.terra.api.config.ConfigPack; + /** * An event with functionality directly linked to a {@link ConfigPack}. *

diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java index d1ecb3fcf..1fd571cc0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java @@ -1,13 +1,14 @@ package com.dfsek.terra.api.event.events.config; import com.dfsek.tectonic.config.Configuration; + +import java.util.function.BiConsumer; + import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.Loader; import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; -import java.util.function.BiConsumer; -import java.util.function.Consumer; /** * Fired when a pack is searched for {@link Configuration}s. @@ -18,25 +19,25 @@ import java.util.function.Consumer; public class ConfigurationDiscoveryEvent implements PackEvent, FailThroughEvent { private final ConfigPack pack; private final Loader loader; - + private final BiConsumer consumer; - + public ConfigurationDiscoveryEvent(ConfigPack pack, Loader loader, BiConsumer consumer) { this.pack = pack; this.loader = loader; this.consumer = consumer; } - + + public void register(String identifier, Configuration config) { + consumer.accept(identifier, config); + } + @Override public ConfigPack getPack() { return pack; } - + public Loader getLoader() { return loader; } - - public void register(String identifier, Configuration config) { - consumer.accept(identifier, config); - } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java index 0fb9f3363..7d8499fb1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java @@ -2,13 +2,15 @@ package com.dfsek.terra.api.event.events.config; import com.dfsek.tectonic.abstraction.AbstractConfiguration; import com.dfsek.tectonic.config.ConfigTemplate; + +import java.util.function.Consumer; + import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.util.reflection.ReflectionUtil; -import java.util.function.Consumer; /** * Fired when each individual configuration is loaded. @@ -21,46 +23,49 @@ public class ConfigurationLoadEvent implements PackEvent, FailThroughEvent { private final AbstractConfiguration configuration; private final Consumer loader; private final ConfigType type; - + private final Object loaded; - - public ConfigurationLoadEvent(ConfigPack pack, AbstractConfiguration configuration, Consumer loader, ConfigType type, Object loaded) { + + public ConfigurationLoadEvent(ConfigPack pack, AbstractConfiguration configuration, Consumer loader, + ConfigType type, Object loaded) { this.pack = pack; this.configuration = configuration; this.loader = loader; this.type = type; this.loaded = loaded; } - - @Override - public ConfigPack getPack() { - return pack; - } - - public AbstractConfiguration getConfiguration() { - return configuration; - } - + public T load(T template) { loader.accept(template); return template; } - - public ConfigType getType() { - return type; - } - + public boolean is(Class clazz) { return clazz.isAssignableFrom(type.getTypeKey().getRawType()); } - + + @Override + public ConfigPack getPack() { + return pack; + } + + public AbstractConfiguration getConfiguration() { + return configuration; + } + + public ConfigType getType() { + return type; + } + @SuppressWarnings("unchecked") public T getLoadedObject(Class clazz) { if(!clazz.isAssignableFrom(type.getTypeKey().getRawType())) - throw new ClassCastException("Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeKey().getType()) + " to class " + clazz.getCanonicalName()); + throw new ClassCastException( + "Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeKey().getType()) + " to class " + + clazz.getCanonicalName()); return (T) loaded; } - + @SuppressWarnings("unchecked") public T getLoadedObject() { return (T) loaded; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java index 72382d3f3..78ffdcb6e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java @@ -2,27 +2,24 @@ package com.dfsek.terra.api.event.events.config.pack; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; + import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; + /** * An event related to the loading process of config packs. */ public abstract class ConfigPackLoadEvent implements PackEvent, FailThroughEvent { private final ConfigPack pack; private final ExceptionalConsumer configLoader; - + public ConfigPackLoadEvent(ConfigPack pack, ExceptionalConsumer configLoader) { this.pack = pack; this.configLoader = configLoader; } - - @Override - public ConfigPack getPack() { - return pack; - } - + /** * Load a custom {@link ConfigTemplate} using the pack manifest. * @@ -31,7 +28,12 @@ public abstract class ConfigPackLoadEvent implements PackEvent, FailThroughEvent public void loadTemplate(ConfigTemplate template) throws ConfigException { configLoader.accept(template); } - + + @Override + public ConfigPack getPack() { + return pack; + } + public interface ExceptionalConsumer { void accept(T value) throws ConfigException; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java index 139c8284e..39905989a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java @@ -1,8 +1,10 @@ package com.dfsek.terra.api.event.events.config.pack; import com.dfsek.tectonic.config.ConfigTemplate; + import com.dfsek.terra.api.config.ConfigPack; + /** * Called when a config pack has finished loading. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java index 2fc9c96e2..192d6b606 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java @@ -1,8 +1,10 @@ package com.dfsek.terra.api.event.events.config.pack; import com.dfsek.tectonic.config.ConfigTemplate; + import com.dfsek.terra.api.config.ConfigPack; + /** * Called before a config pack's registries are filled. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java index a18568d45..13fffacf4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java @@ -7,31 +7,34 @@ import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.ReflectionUtil; + public abstract class ConfigTypeLoadEvent implements PackEvent, FailThroughEvent { private final ConfigType type; private final CheckedRegistry registry; - + private final ConfigPack pack; - + public ConfigTypeLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { this.type = type; this.registry = registry; this.pack = pack; } - + + public boolean is(Class clazz) { + return clazz.isAssignableFrom(type.getTypeKey().getRawType()); + } + @Override public ConfigPack getPack() { return pack; } - - public boolean is(Class clazz) { - return clazz.isAssignableFrom(type.getTypeKey().getRawType()); - } - + @SuppressWarnings("unchecked") public CheckedRegistry getRegistry(Class clazz) { if(!clazz.isAssignableFrom(type.getTypeKey().getRawType())) - throw new ClassCastException("Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeKey().getType()) + " to class " + clazz.getCanonicalName()); + throw new ClassCastException( + "Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeKey().getType()) + " to class " + + clazz.getCanonicalName()); return (CheckedRegistry) registry; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java index b00140387..0e7fd3110 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.CheckedRegistry; + public class ConfigTypePostLoadEvent extends ConfigTypeLoadEvent { public ConfigTypePostLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { super(type, registry, pack); diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java index cab922dad..13cc1742e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.CheckedRegistry; + public class ConfigTypePreLoadEvent extends ConfigTypeLoadEvent { public ConfigTypePreLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { super(type, registry, pack); diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java index 8f472e439..f43a86f93 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.event.events.platform; import com.dfsek.terra.api.event.events.Event; + /** * Called when the platform is initialized. */ diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java index ecd4a842d..4ed04a634 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java @@ -4,23 +4,24 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.event.events.PackEvent; + /** * Called when an entity is spawned. */ public class EntitySpawnEvent implements PackEvent { private final ConfigPack pack; private final Entity entity; - + public EntitySpawnEvent(ConfigPack pack, Entity entity) { this.pack = pack; this.entity = entity; } - + @Override public ConfigPack getPack() { return pack; } - + /** * Get the entity that triggered the event. * diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java index 4ccf5302b..092538a6c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java @@ -1,40 +1,41 @@ package com.dfsek.terra.api.event.events.world.generation; +import org.jetbrains.annotations.NotNull; + import com.dfsek.terra.api.block.entity.Container; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.event.events.AbstractCancellable; -import com.dfsek.terra.api.event.events.Cancellable; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.vector.Vector3; -import org.jetbrains.annotations.NotNull; + /** * Called when loot is populated. */ -public class LootPopulateEvent extends AbstractCancellable implements PackEvent, Cancellable { +public class LootPopulateEvent extends AbstractCancellable implements PackEvent { private final Container container; private final ConfigPack pack; private final Structure structure; private LootTable table; - + public LootPopulateEvent(Container container, LootTable table, ConfigPack pack, Structure structure) { this.container = container; this.table = table; this.pack = pack; this.structure = structure; } - + @Override public ConfigPack getPack() { return pack; } - + public Vector3 getPosition() { return container.getPosition(); } - + /** * Get the {@link Container} representing the inventory. * @@ -43,7 +44,7 @@ public class LootPopulateEvent extends AbstractCancellable implements PackEvent, public Container getContainer() { return container; } - + /** * Get the loot table to be populated. * @@ -52,7 +53,7 @@ public class LootPopulateEvent extends AbstractCancellable implements PackEvent, public LootTable getTable() { return table; } - + /** * Set the loot table to be populated. * @@ -61,7 +62,7 @@ public class LootPopulateEvent extends AbstractCancellable implements PackEvent, public void setTable(@NotNull LootTable table) { this.table = table; } - + /** * Get the script used to generate the structure. * diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java b/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java index 444c9d8c6..e4fc6dc8c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java @@ -1,16 +1,16 @@ package com.dfsek.terra.api.event.functional; -import com.dfsek.terra.api.event.EventManager; -import com.dfsek.terra.api.event.events.Event; - import java.util.function.Consumer; +import com.dfsek.terra.api.event.events.Event; + + public interface EventContext { EventContext then(Consumer action); - + EventContext priority(int priority); - + EventContext failThrough(); - + EventContext global(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java b/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java index 242cb4d2c..f666b7571 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java @@ -5,8 +5,9 @@ import com.dfsek.terra.api.event.EventHandler; import com.dfsek.terra.api.event.events.Event; import com.dfsek.terra.api.util.reflection.TypeKey; + public interface FunctionalEventHandler extends EventHandler { EventContext register(TerraAddon addon, Class clazz); - + EventContext register(TerraAddon addon, TypeKey clazz); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java index 2a9c176a0..af4d09242 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java +++ b/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java @@ -1,15 +1,16 @@ package com.dfsek.terra.api.handle; +import java.util.Set; + import com.dfsek.terra.api.inventory.Item; import com.dfsek.terra.api.inventory.item.Enchantment; -import java.util.Set; public interface ItemHandle { - + Item createItem(String data); - + Enchantment getEnchantment(String id); - + Set getEnchantments(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java index 7397485bc..ec99d0dc1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java +++ b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java @@ -7,22 +7,24 @@ import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.vector.Vector3; + /** * Interface to be implemented for world manipulation. */ public interface WorldHandle { BlockState createBlockData(String data); - + BlockState air(); - - EntityType getEntity(String id); - + BlockEntity createBlockEntity(Vector3 location, BlockState block, String snbt); - + + EntityType getEntity(String id); + /** * Get the locations selected by a player. (Usually via WorldEdit) * * @param player Player to get locations for + * * @return Pair of locations. */ default Pair getSelectedLocation(Player player) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/injection/Injector.java b/common/api/src/main/java/com/dfsek/terra/api/injection/Injector.java index 648365c19..3e622fa07 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/injection/Injector.java +++ b/common/api/src/main/java/com/dfsek/terra/api/injection/Injector.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.injection; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.injection.exception.InjectionException; + /** * Dynamic dependency injector. *

@@ -17,7 +18,7 @@ public interface Injector { * @param target Target class type. */ void addExplicitTarget(Class target); - + /** * Inject the stored object into an object. *

@@ -27,6 +28,7 @@ public interface Injector { * ({@link #addExplicitTarget(Class)}. * * @param object Object to inject into + * * @throws InjectionException If: *