Skip to content

Commit 51262d2

Browse files
Merge pull request #7 from Con-JS-Development/development
New Dynamic Properties Database
2 parents ef6d801 + 61d0b82 commit 51262d2

File tree

6 files changed

+382
-878
lines changed

6 files changed

+382
-878
lines changed

README.md

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Con-Databases
2-
This package contains three types of databases, JsonDatabase, NBTDatabase, CustomDatabase.
3-
Each of these database types supports all possible [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) class operations from ECMAScript, which means.
2+
New version of JsonDatabase is based on dynamic properties.
3+
This database supports all possible [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) class operations from ECMAScript.
44
- [Starting Using Con-Databases](./docs/HOW_TO_SETUP.md)
5-
- [Using CustomDatabase](./docs/CUSTOM_DATABASE.md) *(Soon)*
5+
- [Basic API documentation](./docs/API-Documentation.md)
66

77
### Inherited from Map
88
- size: number of properties
@@ -16,58 +16,68 @@ Each of these database types supports all possible [Map](https://developer.mozil
1616
- has(key: string): returns true when database has a value for that key
1717
- keys(): returns iterbale of keys
1818
- values(): returns iterable of values
19-
### Additional Methods
20-
- load(): will load database from provided scoreboard
21-
- loadAsync(): will load database asynchonously from provided scoreboard
22-
- rebuild(): when database is deleted by user in the world you can call rebuild to save loaded data without lost
23-
- rebuildAsync(): same as rebuild() but asyncronouse
24-
### Additional Properties
25-
- objective: returns scoreboard objective what is database binded to
26-
- id: returns id of the objective
27-
- loaded: returns boolean, true when database is loaded
28-
- maxLength: max size of key and value after parsed via parse
29-
- savingMode: mode when your database is saving your data after change
30-
- OneTimeSave: Saving after value was changed
31-
- EndTickSave: Saving at the end of the tick, ater any changes occurs
32-
- IntervalTick: Saving Every interval if changes occurs
33-
34-
### Database Types
35-
- JsonDatabase, is saving data in JSON form. (SuperFast/EasyToRead)
36-
- NBTDatabase, is saving data in NBT form. (Fast/HardToRead)
37-
- Custom, is saving data in format of provided parser (undefined/undefined)
19+
### Additional Methods & Properties
20+
- dispose(): dispose the current instance of database anc clears it chache, saved data are not lost!
21+
- isValid(): returns true when source is valid and database is not disposed
22+
- isDisposed: property returns if database is disposed
23+
# Other examples
3824

3925
### Dual instance security!
4026
```js
41-
const myDB1 = new JsonDatabase("sameId");
42-
const myDB2 = new NBTDatabase("sameId"); //returns JsonDatabase because database with same id "sameId" was already created.
27+
const myDB1 = new JsonDatabase(world,"sameId");
28+
const myDB2 = new WorldDatabase("sameId"); //returns JsonDatabase because database with same id "sameId" and same source was already created.
4329

4430
console.log(myDB1 === myDB2); //true the very same instance!
4531
```
4632

4733
### Example
4834
```js
49-
// INITIALIZATION OF DATABASE
50-
const myDB = new JsonDatabase("MyIdentifier").load();
51-
const myDB = new NBTDatabase("MyIdentifier2").load();
52-
const myDB = new CustomDatabase(JSON /* JSON is parser */,"MyIdentifier3").load();
53-
54-
//using (get/set) to (read/write) data (from/to) database
55-
const worldOpenedCount = myDB.get("openCount")??0;
56-
myDB.set("openCount", ++worldOpenedCount);
57-
58-
//getting all data saved in database
59-
for(const [key, value] of myDB.entries()){
60-
console.warn(key, value);
35+
import {world} from "@minecraft/server";
36+
import {JsonDatabase} from "./con-database.js";
37+
38+
const db = new WorldDatabase("my id");
39+
40+
db.set("key1", "value1");
41+
db.set("key2", {isComplexObject: true});
42+
43+
console.warn(db.get("key1")); // "value1"
44+
45+
db.delete("key1");
46+
47+
console.warn(db.get("key1")); // undefined
48+
49+
// Iterating over the map using for loop
50+
for (const [key, value] of db) {
51+
console.warn(`${key} = ${value}`);
6152
}
6253

63-
//clearing database
64-
myDB.clear();
54+
db.clear();
55+
56+
// Getting the size of the map
57+
console.warn(db.size); // 0
58+
```
59+
## Example saving deaths for each player
60+
Each key is unique to its player because key include players id, so database keys looks like
61+
```
62+
5648463deaths
63+
6843684deaths
64+
6545463deaths
65+
```
66+
Code
67+
```js
68+
import {world} from "@minecraft/server";
69+
import {WorldDatabase} from "databases.js";
70+
71+
const stats = new WorldDatabase("playerStats");
72+
73+
world.afterEvents.entityDie.subscribe(({deadEntity})=>
74+
setDeaths(deadEntity,getDeaths(deadEntity) + 1);
75+
,{entityTypes:["mineraft:player"]});
76+
6577

66-
//removing specific value
67-
myDB.delete("Josh");
78+
function getDeaths(player){
79+
return stats.get(player.id + "deaths")??0;}
6880

69-
//forEaching every element in scoreboard
70-
myDB.forEach((value,key)=>{
71-
console.warn(key, value);
72-
});
81+
function setDeaths(player,deaths){
82+
stats.set(player.id + "deaths",deaths);}
7383
```

database.d.ts

Lines changed: 12 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -1,182 +1,14 @@
1-
import {ScoreboardObjective, ScoreboardIdentity, Entity} from "@minecraft/server";
2-
//////////////////////////////////////
3-
// NBT-SERIALIZER.D.TS
4-
//////////////////////////////////////
5-
6-
type StringBase = 16|8|32;
7-
type IStreamType = number | number | {buffer: ArrayBuffer};
8-
declare class Stream extends DataView{
9-
constructor(buffer: ArrayBuffer | number, offset?: number)
10-
protected __offset__: number
11-
readonly offset: number
12-
readonly size: number
13-
readonly EndOfStream: boolean
14-
setOffset(num: number): void
15-
static fromString(text: string, options?: {bufferLength?: number, base?:StringBase},...params: any): Stream
16-
/**@param {Stream} stream @param {8|16|32} base*/
17-
static toString(stream: Stream, base?: StringBase): string
18-
toString(base?: StringBase): string
19-
}
20-
declare class BinaryStreamWriter extends Stream{
21-
constructor(stream: IStreamType)
22-
writeBytes(buffer: ArrayBuffer,length?:number ): number
23-
writeString(text: string, base?: StringBase): number
24-
writeByte(num: number): number
25-
writeUint8(num: number): number
26-
writeInt8(num: number): number
27-
writeInt16(num: number): number
28-
writeUint16(num: number): number
29-
writeInt32(num: number): number
30-
writeUint32(num: number): number
31-
writeFloat32(num: number): number
32-
writeFloat64(num: number): number
33-
static fromString(text: string, options?: {bufferLength?: number, base?:StringBase},...params: any): BinaryStreamWriter
34-
}
35-
declare class BinaryStreamReader extends Stream{
36-
constructor(stream: IStreamType)
37-
readBytes(length?: number): Uint8Array
38-
readString(length: number, base?: StringBase):string
39-
readByte():number
40-
readUint8():number
41-
readInt8():number
42-
readInt16():number
43-
readUint16():number
44-
readInt32():number
45-
readUint32():number
46-
readFloat32():number
47-
readFloat64():number
48-
static fromString(text: string, options?: {bufferLength?: number, base?:StringBase},...params: any): BinaryStreamReader
49-
}
50-
declare class EndOfStreamError extends Error{}
51-
declare enum NBTTypes {
52-
"EndOfCompoud"=0,
53-
"Compoud"=1,
54-
"Array"=2,
55-
"TypedArray"=3,
56-
"Uint8"=4,
57-
"Uint16"=5,
58-
"Int32"=6,
59-
"Double"=7,
60-
"String"=8,
61-
"Empty"=9,
62-
"Boolean"=10
63-
}
64-
declare class NBTStreamWriter extends BinaryStreamWriter{
65-
constructor(stream: IStreamType, options?: object | NBTStreamWriter)
66-
protected __options__: NBTWriterOptions;
67-
writeTypedArray<t>(array: Array<t>): number
68-
writeBoolean(bool: boolean):number
69-
writeString(text: string): number
70-
writeArray(array: any[]): number
71-
writeCompoud(object: object): number
72-
writeEmpty(): number
73-
writeType(type: NBTTypes): number
74-
static fromString(text: string, options?: {bufferLength?: number, base?:StringBase},...params: any): NBTStreamWriter
75-
}
76-
declare class NBTStreamReader extends BinaryStreamReader{
77-
constructor(stream: IStreamType, options?: object | NBTReaderOptions)
78-
protected __options__: NBTReaderOptions;
79-
readTypedArray(): Array<any>
80-
readBoolean(): boolean
81-
readString(): string
82-
readArray(): any[]
83-
readCompoud(): object
84-
readEmpty(): undefined
85-
readType(): NBTTypes
86-
static fromString(text: string, options?: {bufferLength?: number, base?:StringBase},...params: any): NBTStreamReader
87-
}
88-
declare const NBT: {
89-
ReadNBT(stream: NBTStreamReader): any
90-
WriteNBT(data: any, stream: NBTStreamWriter, type?: NBTTypes): number
91-
getType(data: any): NBTTypes
92-
stringify(object:any, options?: NBTWriterOptions): string
93-
parse(string: string, options?: NBTReaderOptions): any
94-
createNewWriters<t extends Partial<typeof defaultWriters>>(object?: t): t & typeof defaultWriters
95-
createNewReaders<t extends Partial<typeof defualtReaders>>(object?: t): t & typeof defualtReaders
96-
}
97-
type WriterCall = (stream: NBTStreamWriter, data: any)=>number
98-
type ReaderCall = (stream: NBTStreamReader)=>any
99-
declare const defaultWriters: {
100-
[NBTTypes.Compoud]:WriterCall,
101-
[NBTTypes.Empty]:WriterCall,
102-
[NBTTypes.Array]:WriterCall,
103-
[NBTTypes.String]:WriterCall,
104-
[NBTTypes.Boolean]:WriterCall,
105-
[NBTTypes.Uint8]:WriterCall,
106-
[NBTTypes.Uint16]:WriterCall,
107-
[NBTTypes.Int32]:WriterCall,
108-
[NBTTypes.Double]:WriterCall,
109-
[NBTTypes.TypedArray]:WriterCall
110-
}
111-
declare const defualtReaders: {
112-
[NBTTypes.Compoud]:ReaderCall,
113-
[NBTTypes.Empty]:ReaderCall,
114-
[NBTTypes.Array]:ReaderCall,
115-
[NBTTypes.String]:ReaderCall,
116-
[NBTTypes.Boolean]:ReaderCall,
117-
[NBTTypes.Uint8]:ReaderCall,
118-
[NBTTypes.Uint16]:ReaderCall,
119-
[NBTTypes.Int32]:ReaderCall,
120-
[NBTTypes.Double]:ReaderCall,
121-
[NBTTypes.TypedArray]:ReaderCall
122-
}
123-
declare class NBTStreamOptions{
124-
nbtTypes: object & NBTTypes
125-
getType:(data: any)=>NBTStreamOptions["nbtTypes"][keyof NBTStreamOptions["nbtTypes"]]
126-
}
127-
declare class NBTWriterOptions extends NBTStreamOptions{
128-
writers: ReturnType<typeof NBT["createNewWriters"]>;
129-
}
130-
declare class NBTReaderOptions extends NBTStreamOptions{
131-
readers: ReturnType<typeof NBT["createNewReaders"]>;
132-
}
133-
134-
135-
136-
137-
//////////////////////////////////////
138-
// DATABASE.JS
139-
//////////////////////////////////////
140-
export enum DatabaseSavingModes {
141-
OneTimeSave="OneTimeSave",
142-
EndTickSave="EndTickSave",
143-
TickInterval="TickInterval"
144-
}
145-
export enum ChangeAction {
146-
Change=0,
147-
Remove=1
148-
}
149-
/**@extends {Map<string,any>}*/
150-
declare class ScoreboardDatabaseManager extends Map<string,any>{
151-
private _saveMode_: DatabaseSavingModes;
152-
private _loadingPromise_?: Promise<this>;
153-
private hasChanges: boolean;
154-
private readonly _scoreboard_: ScoreboardObjective;
155-
protected readonly _source_: Map<string,string|ScoreboardIdentity|Entity>;
156-
protected readonly _parser_: {stringify:(data: any)=>string,parse:(data: string)=>any};
157-
constructor(objective: string | ScoreboardObjective, saveMode?: DatabaseSavingModes);
158-
constructor(objective: string | ScoreboardObjective, saveMode: DatabaseSavingModes.EndTickSave, interval?: number);
159-
/**@inheritdoc */
160-
set(key: string, value: any): this
161-
/**@inheritdoc */
1+
import {World, Entity} from "@minecraft/server";
2+
declare class DynamicDatabase extends Map{
3+
protected constructor();
4+
set(key: string, value: any)
1625
delete(key: string): boolean
163-
/**@inheritdoc */
1646
clear(): void
165-
load(): this
166-
loadAsync(): Promise<this>
167-
rebuild(): this;
168-
rebuildAsync(): Promise<this>;
169-
readonly objective: ScoreboardObjective
170-
readonly id: string;
171-
readonly loaded: boolean;
172-
readonly maxLength: number;
173-
readonly savingMode: DatabaseSavingModes;
174-
readonly type: "DefualtJsonType"| "JsonType"| "NBTType" | "CustomType";
175-
readonly loadingAwaiter: Promise<this>;
176-
}
177-
export class JsonDatabase extends ScoreboardDatabaseManager{}
178-
export class NBTDatabase extends ScoreboardDatabaseManager{}
179-
export class CustomDatabase extends ScoreboardDatabaseManager{
180-
constructor(parser: {parse:(data:string)=>any,stringify:(data: any)=>string}, objective: string | ScoreboardObjective, saveMode?: DatabaseSavingModes);
181-
constructor(parser: {parse:(data:string)=>any,stringify:(data: any)=>string}, objective: string | ScoreboardObjective, saveMode: DatabaseSavingModes.EndTickSave, interval?: number);
182-
}
7+
isValid(): boolean
8+
dispose(): void
9+
readonly isDisposed: boolean
10+
}
11+
//@ts-ignore
12+
export class JsonDatabase extends DynamicDatabase{ constructor(source: World | Entity, id: string); }
13+
//@ts-ignore
14+
export class WorldDatabase extends JsonDatabase { constructor(id: string) }

0 commit comments

Comments
 (0)