Skip to content

Commit ed13248

Browse files
committed
@base注解,修改命令类的基础
1 parent 58659e4 commit ed13248

File tree

14 files changed

+86
-44
lines changed

14 files changed

+86
-44
lines changed

src/main/antlr/mcfppParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ normalType
602602
;
603603

604604
functionReturnType
605-
: type
605+
: type EXCL?
606606
| VOID
607607
;
608608

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package top.mcfpp.mni.annotation;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import top.mcfpp.model.Class;
5+
import top.mcfpp.model.annotation.ClassAnnotation;
6+
7+
public class Base extends ClassAnnotation {
8+
9+
String baseEntity;
10+
11+
@SuppressWarnings("unused")
12+
private Base(String baseEntity) {
13+
super("Base","mcfpp.annotation");
14+
this.baseEntity = baseEntity;
15+
}
16+
17+
@Override
18+
public void forClass(@NotNull Class clazz) {
19+
clazz.setBaseEntity(baseEntity);
20+
}
21+
}

src/main/java/top/mcfpp/mni/annotation/ConcreteOnly.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ private ConcreteOnly() {
1212
}
1313

1414
@Override
15-
public void forDataObject(@NotNull DataTemplate data){}
15+
public void forDataTemplate(@NotNull DataTemplate data){}
1616
}

src/main/java/top/mcfpp/mni/annotation/From.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public From(String className) {
1616
}
1717

1818
@Override
19-
public void forDataObject(@NotNull DataTemplate data) {
19+
public void forDataTemplate(@NotNull DataTemplate data) {
2020
try {
2121
data.getNativeFromClass(Class.forName(className));
2222
} catch (ClassNotFoundException e) {

src/main/java/top/mcfpp/mni/annotation/NoInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ private NoInstance() {
1212
}
1313

1414
@Override
15-
public void forDataObject(@NotNull DataTemplate data){}
15+
public void forDataTemplate(@NotNull DataTemplate data){}
1616
}

src/main/java/top/mcfpp/mni/annotation/To.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public To(String className) {
1515
}
1616

1717
@Override
18-
public void forDataObject(@NotNull DataTemplate data) {
18+
public void forDataTemplate(@NotNull DataTemplate data) {
1919
throw new UnsupportedOperationException("Not implemented yet");
2020
}
2121
}

src/main/kotlin/top/mcfpp/antlr/MCFPPAnnotationVisitor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class MCFPPAnnotationVisitor: mcfppParserBaseVisitor<Unit>(){
7777
throw UndefinedException("Template should have been defined: $id")
7878
}
7979
annotationCache.forEach {
80-
it.forDataObject(template)
80+
it.forDataTemplate(template)
8181
}
8282
template.annotations.addAll(annotationCache)
8383
annotationCache.clear()
@@ -92,7 +92,7 @@ class MCFPPAnnotationVisitor: mcfppParserBaseVisitor<Unit>(){
9292
throw UndefinedException("Template should have been defined: $id")
9393
}
9494
annotationCache.forEach {
95-
it.forDataObject(objectTemplate)
95+
it.forDataTemplate(objectTemplate)
9696
}
9797
objectTemplate.annotations.addAll(annotationCache)
9898
annotationCache.clear()

src/main/kotlin/top/mcfpp/command/Commands.kt

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import top.mcfpp.core.lang.bool.ScoreBool
1010
import top.mcfpp.type.MCFPPClassType
1111
import top.mcfpp.lib.NBTPath
1212
import top.mcfpp.model.CanSelectMember
13+
import top.mcfpp.model.Class
1314
import top.mcfpp.model.ObjectClass
1415
import top.mcfpp.model.field.GlobalField
1516
import top.mcfpp.model.function.Function
@@ -199,33 +200,9 @@ object Commands {
199200
* @return 生成的命令。数组的最后一个命令为`execute`命令
200201
*/
201202
fun selectRun(a : CanSelectMember, command: Command, hasExecuteRun: Boolean = true) : Array<Command>{
202-
val final = when(a){
203-
is ClassPointer -> {
204-
if(a.identifier == "this"){
205-
return arrayOf(command)
206-
}
207-
val qwq = arrayOf(
208-
Command.build("data modify storage entity ${ClassPointer.tempItemEntityUUID} Thrower set from storage mcfpp:system ${Project.config.rootNamespace}.stack_frame[${a.stackIndex}].${a.identifier}"),
209-
Command.build("execute as ${ClassPointer.tempItemEntityUUID} on origin")
210-
)
211-
if(hasExecuteRun) {
212-
qwq.last().build("run","run").build(command)
213-
}else{
214-
qwq.last().build(command)
215-
}
216-
qwq
217-
}
218-
is ObjectVar -> selectRun(a.value, command, hasExecuteRun)
219-
is MCFPPClassType -> {
220-
if(hasExecuteRun){
221-
arrayOf(Command.build("execute as ${(a.cls as ObjectClass).uuid} run").build(command))
222-
}else{
223-
arrayOf(Command.build("execute as ${(a.cls as ObjectClass).uuid}").build(command))
224-
}
225-
}
226-
else -> TODO()
227-
}
228-
return final
203+
val qwq = selectRun(a, hasExecuteRun)
204+
qwq.last().build(command)
205+
return qwq
229206
}
230207

231208
/**
@@ -240,12 +217,26 @@ object Commands {
240217
val final = when(a){
241218
is ClassPointer -> {
242219
if(a.identifier == "this"){
220+
if(a.clazz.baseEntity != Class.ENTITY_MARKER && a.clazz.baseEntity != Class.ENTITY_ITEM_DISPLAY){
221+
val qwq = arrayOf(Command.build("execute on passengers as entity @n[tag=${a.tag}_data]"))
222+
if(hasExecuteRun){
223+
qwq.last().build("run", "run")
224+
}
225+
return qwq
226+
}
243227
return arrayOf(Command())
244228
}
245-
val qwq = arrayOf(
246-
Command.build("data modify storage entity ${ClassPointer.tempItemEntityUUID} Thrower set from storage mcfpp:system ${Project.config.rootNamespace}.stack_frame[${a.stackIndex}].${a.identifier}"),
247-
Command.build("execute as ${ClassPointer.tempItemEntityUUID} on origin")
248-
)
229+
val qwq = if(a.clazz.baseEntity != Class.ENTITY_MARKER && a.clazz.baseEntity != Class.ENTITY_ITEM_DISPLAY){
230+
arrayOf(
231+
Command.build("data modify storage entity ${ClassPointer.tempItemEntityUUID} Thrower set from storage mcfpp:system ${Project.config.rootNamespace}.stack_frame[${a.stackIndex}].${a.identifier}"),
232+
Command.build("execute as ${ClassPointer.tempItemEntityUUID} on origin on passengers as entity @n[tag=${a.tag}_data]")
233+
)
234+
}else{
235+
arrayOf(
236+
Command.build("data modify storage entity ${ClassPointer.tempItemEntityUUID} Thrower set from storage mcfpp:system ${Project.config.rootNamespace}.stack_frame[${a.stackIndex}].${a.identifier}"),
237+
Command.build("execute as ${ClassPointer.tempItemEntityUUID} on origin")
238+
)
239+
}
249240
if(hasExecuteRun) {
250241
qwq.last().build("run","run")
251242
}

src/main/kotlin/top/mcfpp/model/Class.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,17 @@ open class Class : CompoundData {
7474
*/
7575
var objectClass : ObjectClass? = null
7676

77+
/**
78+
* 这个类的基本实体。默认为marker
79+
*/
80+
var baseEntity: String = ENTITY_MARKER
81+
set(value) {
82+
if(invalidBaseEntity.contains(value)){
83+
LogProcessor.error("Invalid base entity: $value")
84+
}
85+
}
86+
private val invalidBaseEntity = listOf("player", "leash_knot", "lightning_bolt", "fishing_bobber", "creaking_transient")
87+
7788
/**
7889
* 生成一个类,它拥有指定的标识符和命名空间
7990
* @param identifier 类的标识符
@@ -177,6 +188,9 @@ open class Class : CompoundData {
177188

178189
val baseClass = Class("Object","mcfpp.lang")
179190

191+
val ENTITY_MARKER = "marker"
192+
val ENTITY_ITEM_DISPLAY = "item_display"
193+
180194
class UndefinedClassOrInterface(identifier: String, namespace: String?)
181195
: Class(identifier, namespace?:Project.currNamespace) {
182196

src/main/kotlin/top/mcfpp/model/annotation/Annotation.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import java.io.Serializable
2020
* ```
2121
* 注解可以拥有参数,或者没有参数。当注解没有参数的时候,其括号是可以省略的
2222
*
23-
* @constructor Create empty Annotation
23+
* 可以通过继承此类来实现一个注解。抽象方法[forClass],[forDataTemplate],[forFunction]分别表示注解对类、数据模板和函数的操作。
24+
*
25+
* 使用MNI实现注解的时候,注解需要拥有一个私有的构造函数,并且此构造函数的参数列表和在mcfpp调用注解的时候注解的参数列表的参数类型和顺序相同。在执行注解的时候,将会把传入注解的mcfpp变量转换为jvm变量传入注解的构造函数中构建一个新的注解实例。
26+
*
27+
* 继承[ClassAnnotation],[DataTemplateAnnotation],[FunctionAnnotation]来实现注解,让注解只能适用于类、数据模板和函数。如果直接继承此类,请注意在[forClass],[forFunction],[forDataTemplate]对应的情况中抛出异常
2428
*/
2529
abstract class Annotation : Serializable {
2630

@@ -49,7 +53,7 @@ abstract class Annotation : Serializable {
4953

5054
abstract fun forFunction(function: Function)
5155

52-
abstract fun forDataObject(data: DataTemplate)
56+
abstract fun forDataTemplate(data: DataTemplate)
5357

5458
companion object {
5559
fun newInstance(clazz: java.lang.Class<out Annotation>, args: ArrayList<Any>): Annotation {

0 commit comments

Comments
 (0)