67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import { ApiMsgEnum, InputTypeEnum } from "./Enum";
							 | 
						||
| 
								 | 
							
								import { strencode } from "./Utils";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export const binaryEncode = (proto: ApiMsgEnum, data: any): DataView => {
							 | 
						||
| 
								 | 
							
								  if (proto === ApiMsgEnum.MsgClientSync) {
							 | 
						||
| 
								 | 
							
								    switch (data.type) {
							 | 
						||
| 
								 | 
							
								      case InputTypeEnum.ActorMove: {
							 | 
						||
| 
								 | 
							
								        let index = 0
							 | 
						||
| 
								 | 
							
								        const ab = new ArrayBuffer(3 + 12)
							 | 
						||
| 
								 | 
							
								        const view = new DataView(ab)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, proto)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, data.type)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, data.id)
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.direction.x)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.direction.y)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.dt)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        return view
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      case InputTypeEnum.WeaponShoot: {
							 | 
						||
| 
								 | 
							
								        let index = 0
							 | 
						||
| 
								 | 
							
								        const ab = new ArrayBuffer(3 + 16)
							 | 
						||
| 
								 | 
							
								        const view = new DataView(ab)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, proto)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, data.type)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, data.id)
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.position.x)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.position.y)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.direction.x)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.direction.y)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        return view
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      case InputTypeEnum.TimePast: {
							 | 
						||
| 
								 | 
							
								        let index = 0
							 | 
						||
| 
								 | 
							
								        const ab = new ArrayBuffer(1 + 1 + 4)
							 | 
						||
| 
								 | 
							
								        const view = new DataView(ab)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, proto)
							 | 
						||
| 
								 | 
							
								        view.setUint8(index++, data.type)
							 | 
						||
| 
								 | 
							
								        view.setFloat32(index, data.dt)
							 | 
						||
| 
								 | 
							
								        index += 4
							 | 
						||
| 
								 | 
							
								        return view
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      default: {
							 | 
						||
| 
								 | 
							
								        const ab = new ArrayBuffer(0)
							 | 
						||
| 
								 | 
							
								        const view = new DataView(ab)
							 | 
						||
| 
								 | 
							
								        return view
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    let index = 0
							 | 
						||
| 
								 | 
							
								    const str = JSON.stringify(data)
							 | 
						||
| 
								 | 
							
								    const ta = strencode(str)
							 | 
						||
| 
								 | 
							
								    const ab = new ArrayBuffer(ta.length + 1)
							 | 
						||
| 
								 | 
							
								    const view = new DataView(ab)
							 | 
						||
| 
								 | 
							
								    view.setUint8(index++, proto)
							 | 
						||
| 
								 | 
							
								    for (let i = 0; i < ta.length; i++) {
							 | 
						||
| 
								 | 
							
								      view.setUint8(index++, ta[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return view
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |