* unifying chunk functions

meow
Dominika 2022-02-12 23:47:46 +01:00
parent 13779a8a47
commit b04b46e899
4 changed files with 49 additions and 29 deletions

21
mc.sh
View File

@ -9,6 +9,9 @@ mkdir -p $TEMP $TEMP/players $TEMP/world
source src/log.sh source src/log.sh
source src/int.sh source src/int.sh
source src/misc.sh
source src/palette.sh
source src/chunk.sh
source src/packet.sh source src/packet.sh
source src/hooks.sh source src/hooks.sh
@ -22,6 +25,7 @@ function keep_alive() {
sleep 5 sleep 5
log "sending keepalive" log "sending keepalive"
echo '092100000000000000ff' | xxd -p -r echo '092100000000000000ff' | xxd -p -r
# random data
done done
} }
@ -97,7 +101,7 @@ while true; do
log "connection dyed" log "connection dyed"
pkill -P $$ pkill -P $$
pkt_chatmessage "- $nick" "00000000000000000000000000000000" > $TEMP/players/$nick/broadcast pkt_chatmessage "- $nick" "00000000000000000000000000000000" > $TEMP/players/$nick/broadcast
sleep 1 sleep 0.3
rm -R "$TEMP/players/$nick" rm -R "$TEMP/players/$nick"
exit exit
fi fi
@ -130,7 +134,7 @@ while true; do
state='' state=''
elif [[ "$state" == '02' ]]; then elif [[ "$state" == '02' ]]; then
nick=$(cut -c 5- <<< "$a" | xxd -p -r | grep -Poh '[A-Za-z0-9_-]*') nick=$(cut -c 5- <<< "$a" | xxd -p -r | grep -Poh '[A-Za-z0-9_-]*')
eid=$(printf "%02x" $RANDOM) eid=$(printf "%04x" $RANDOM | cut -c 1-4)
mkdir -p $TEMP/players/$nick mkdir -p $TEMP/players/$nick
echo -n $eid > $TEMP/players/$nick/eid echo -n $eid > $TEMP/players/$nick/eid
pkt_chatmessage "+ $nick" "00000000000000000000000000000000" > $TEMP/players/$nick/broadcast pkt_chatmessage "+ $nick" "00000000000000000000000000000000" > $TEMP/players/$nick/broadcast
@ -189,13 +193,10 @@ while true; do
echo -n "$(hexpacket_len "$res")14$res" | xxd -p -r echo -n "$(hexpacket_len "$res")14$res" | xxd -p -r
log "sent inventory" log "sent inventory"
pkt_pos
source src/palette.sh
hook_chunks hook_chunks
pkt_pos
spawn_players spawn_players
state='' state=''
else else
@ -222,10 +223,14 @@ while true; do
echo "${pos[0]},${pos[1]},${pos[2]}" > $TEMP/players/$nick/position echo "${pos[0]},${pos[1]},${pos[2]}" > $TEMP/players/$nick/position
hook_move hook_move
elif [[ $a == "12"* ]]; then elif [[ $a == "12"* ]]; then
pos[0]=$(from_ieee754 $(cut -c 3-18 <<< "$a"))
pos[1]=$(from_ieee754 $(cut -c 19-34 <<< "$a"))
pos[2]=$(from_ieee754 $(cut -c 35-50 <<< "$a"))
hook_move hook_move
elif [[ $a == "13"* ]]; then elif [[ $a == "13"* ]]; then
hook_move log "received Player Rotation"
elif [[ $a == "1a"* ]]; then elif [[ $a == "1a"* ]]; then
#cut -c 3-
hook_dig hook_dig
elif [[ $a == "2c"* ]]; then elif [[ $a == "2c"* ]]; then
hook_swing hook_swing

View File

@ -43,9 +43,9 @@ function varint2int() {
echo -n "$out" echo -n "$out"
} }
# parse_position(Position) # decode_position(Position)
# https://wiki.vg/Protocol#Position # https://wiki.vg/Protocol#Position
function parse_position() { function decode_position() {
x=$((0x$1 >> 38)) x=$((0x$1 >> 38))
y=$((0x$1 & 0xFFF)) y=$((0x$1 & 0xFFF))
z=$(((0x$1 >> 12) & 0x3FFFFFF)) z=$(((0x$1 >> 12) & 0x3FFFFFF))

View File

@ -15,11 +15,18 @@ function pkt_pos() {
log "sent player look and position" log "sent player look and position"
} }
# pkt_chunk(chunk_x, chunk_z, fill)
function pkt_chunk() { function pkt_chunk() {
# palettes are really cool once you figure them out :3 # palettes are really cool once you figure them out :3
# https://wiki.vg/Protocol#Chunk_Data_And_Update_Light # https://wiki.vg/Protocol#Chunk_Data_And_Update_Light
local chunk local chunk
local fill
if [[ $3 == '' ]]; then
fill='01'
else
fill="$3"
fi
res="$1" # chunk X res="$1" # chunk X
res+="$2" # chunk Z res+="$2" # chunk Z
@ -31,26 +38,14 @@ function pkt_chunk() {
if [[ -f $TEMP/world/$1$2 ]]; then if [[ -f $TEMP/world/$1$2 ]]; then
chunk=$(cat $TEMP/world/$1$2) chunk=$(cat $TEMP/world/$1$2)
else else
chunk="ffff" # amount of blocks, doesnt matter chunk_header
chunk+="08" # palette - bits per block
#chunk+="04" # palette - bits per block
chunk+="$(int2varint ${#palette[@]})" # palette - entries amount
#chunk+="04"
chunk+="${palette[@]}"
#chunk+="0f af0b 01 00"
chunk+="8004" # len of next array chunk+="8004" # len of next array
l=$(echo -n "8002" | xxd -p -r | varint2int) l=$(echo -n "8002" | xxd -p -r | varint2int)
for (( i=0; i<$((l*16)); i++ )); do chunk+="$(repeat $((l*16)) "$fill")"
chunk+="01" # third entry of palette
done
chunk+="0001" # biome palette chunk_footer
for i in {1..26}; do
chunk+="0000000000000001" # set biome
done
echo -n "$chunk" > $TEMP/world/$1$2 echo -n "$chunk" > $TEMP/world/$1$2
fi fi
@ -74,11 +69,31 @@ function pkt_effect() {
log "sending effect" log "sending effect"
} }
# pkt_particle(x, y, z, particle_id, count)
function pkt_particle() {
res="$(printf '%08x' $4)" # particle id
res+="01" # long distance
res+="0000000000000000" # X
res+="0000000000000000" # Y
res+="0000000000000000" # Z
res+="3f800000" # X offset
res+="3f800000" # Y offset
res+="3f800000" # Z offset
res+="00000001" # particle data
res+="$(printf '%08x' $5)" # particle count
res+="" # data (left blank)
echo -n "$(hexpacket_len "$res")24$res" | xxd -p -r
rhexlog "$res"
log "sending particle"
}
# pkt_playerinfo(name, eid) # pkt_playerinfo(name, eid)
function pkt_playerinfo_add() { function pkt_playerinfo_add() {
res="00" # add player res="00" # add player
res+="01" # total players res+="01" # total players
res+="0000000000000000000000000000$2" # random UUID res+="0000000000000000000000000000$2" # UUID
res+="$(str_len "$1")$(echo -n "$1" | xxd -p)" res+="$(str_len "$1")$(echo -n "$1" | xxd -p)"

View File

@ -8,7 +8,7 @@ palette=()
palette+=("00") # air palette+=("00") # air
palette+=("01") # stone palette+=("01") # stone
palette+=("09") # grass palette+=("09") # grass block
palette+=("0a") # dirt palette+=("0a") # dirt
palette+=("0e") # cobblestone palette+=("0e") # cobblestone
palette+=("0f") # planks palette+=("0f") # planks
@ -37,4 +37,4 @@ palette+=("00") #
palette+=("00") # palette+=("00") #
palette+=("00") # palette+=("00") #
palette+=("00") # palette+=("00") #
palette+=("f60a") # grass palette+=("f60a") # tallgrass